最初の外部参加 、予想どおり、次のように生成されます:
| REASON | MONTH | ------------------- | A | May | | A | May | | A | July | | A | June | | B | May | | B | June | | D | (null) |
ただし、外部結合は、結合条件が少なくとも1回満たされた場合に結果を生成するため、 (そしてNULL
のみを導入します 条件が決してであるかどうかを記録します 満足)、2番目の外部参加
その後、しません (B, July)
のレコードを作成します; Reason = 'D'
も削除します 完全に、参加条件が満たされていないため(そして、他の場所では3か月すべてが満たされているため):
| REASON | MONTH | ------------------ | A | May | | A | May | | B | May | | A | June | | B | June | | A | July |
できた Reason = 'D'
の損失を解決します 追加
OR a.Month IS NULL
参加条件に対して、(B, July)
は生成されません。 。代わりに、(Reason, Month)
のすべてのペアを取得する必要があるためです。 、CROSS JOIN
あなたの具体化されたReasons
マテリアライズされたMonths
を含むテーブル テーブル:
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
| REASON | MONTH | ------------------ | A | May | | B | May | | D | May | | A | June | | B | June | | D | June | | A | July | | B | July | | D | July |
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
| REASON | MONTH | DOWNTIME | ----------------------------- | A | July | 3 | | A | June | 8 | | A | May | 7 | | B | July | (null) | | B | June | 6 | | B | May | 5 | | D | July | (null) | | D | June | (null) | | D | May | (null) |
sqlfiddle でご覧ください 。