4

サーバーのダウンタイムの記録を持つテーブルがあります。
このテーブルの簡易バージョンを sqlfiddle で作成しました。ここを参照してくださいsqlfiddle
テーブルには次のような各レコードがあります

Reason  Month   Down_Time
A       May     2
A       May     5
B       May     5
C       July    15
A       July    3
B       June    6
A       June    8
C       June    2

一致するレコードがない場合、NULL を指定した月と理由のすべての組み合わせを取得するクエリを作成する必要があります
例: 理由 A、B により 5 月、6 月、7 月のシステムのダウンタイムを取得する必要がある場合またはD..私が期待しているのは..

Reason  Month   DOWNTIME
A       May     7
A       June    8
A       July    3
B       May     5
B       June    6
B       July    NULL
D       May     NULL
D       June    NULL
D       July    NULL

特定の月のレコードに D がないため、NULL にする必要があります
これは私のクエリです:

 SELECT Reasons.reason, Months.Month,sum( a.Down_time ) AS downtime
 FROM tabledown a
 RIGHT JOIN (
 SELECT 'A' AS reason
 UNION ALL SELECT 'B' AS reason
 UNION ALL SELECT 'D' AS reason
 ) Reasons
  ON a.reason = Reasons.reason
 RIGHT JOIN (
 SELECT 'May' AS month
  UNION ALL SELECT 'June' AS month
  UNION ALL SELECT 'July' AS month
 ) Months
 ON a.Month = Months.month
 GROUP BY Reasons.reason,Months.month
 ORDER BY Reasons.reason

期待される出力が得られないのはなぜですか:(

4

1 に答える 1

5

予想どおり、最初の外部結合は次のようになります。

| | 理由 | 月 | 月 |
-------------------
| | あ | 5 月 |
| | あ | 5 月 |
| | あ | 7月 |
| | あ | 6月 |
| | ビ | 5 月 |
| | ビ | 6月 |
| | D | (ヌル) |

ただし、外部結合は、結合条件が少なくとも 1 回満たされた場合に結果を生成するため (条件が満たされないNULL場合にのみレコードを導入するため)、2 回目の外部結合はのレコードを生成しません。また、結合条件が満たされていないため (そして 3 か月すべてが他の場所で満たされているため)、完全に削除されます。(B, July)Reason = 'D'

| | 理由 | 月 | 月 |
------------------
| | あ | 5 月 |
| | あ | 5 月 |
| | ビ | 5 月 |
| | あ | 6月 |
| | ビ | 6月 |
| | あ | 7月 |

結合条件に追加することで の損失を解決できますが、それでも生成されません。代わりに、 のすべてのペアを取得する必要があるため、マテリアライズドテーブルとマテリアライズド テーブルを組み合わせる必要があります。Reason = 'D' OR a.Month IS NULL(B, July)(Reason, Month)CROSS JOINReasonsMonths

SELECT Reason, Month
FROM   
  (
    SELECT 'A' AS Reason
    UNION ALL SELECT 'B'
    UNION ALL SELECT 'D'
  ) Reasons CROSS JOIN (
    SELECT 'May' AS Month
    UNION ALL SELECT 'June'
    UNION ALL SELECT 'July'
  ) Months
| | 理由 | 月 | 月 |
------------------
| | あ | 5 月 |
| | ビ | 5 月 |
| | D | 5 月 |
| | あ | 6月 |
| | ビ | 6月 |
| | D | 6月 |
| | あ | 7月 |
| | ビ | 7月 |
| | D | 7月 |

sqlfiddleで参照してください。

次に、結果を基になるデータと外部結合するだけです。

SELECT Reason, Month, SUM(Down_time) downtime
FROM   
  (
    SELECT 'A' AS Reason
    UNION ALL SELECT 'B'
    UNION ALL SELECT 'D'
  ) Reasons CROSS JOIN (
    SELECT 'May' AS Month
    UNION ALL SELECT 'June'
    UNION ALL SELECT 'July'
  ) Months
  LEFT JOIN tabledown USING (Reason, Month)
GROUP BY Reason, Month
| | 理由 | 月 | 月 | ダウンタイム |
------------------------------
| | あ | 7月 | 3 |
| | あ | 6月 | 8 |
| | あ | 5 月 | 7 |
| | ビ | 7月 | (ヌル) |
| | ビ | 6月 | 6 |
| | ビ | 5 月 | 5 |
| | D | 7月 | (ヌル) |
| | D | 6月 | (ヌル) |
| | D | 5 月 | (ヌル) |

sqlfiddleで参照してください。

于 2012-12-02T10:09:52.963 に答える