Je eerste outer join , zoals verwacht, produceert:
| REASON | MONTH | ------------------- | A | May | | A | May | | A | July | | A | June | | B | May | | B | June | | D | (null) |
Echter, omdat outer joins resultaten opleveren als ten minste één keer aan de join-voorwaarde is voldaan (en introduceer alleen NULL
registreert als de voorwaarde nooit is tevreden), je tweede outer join
dan niet maak een record voor (B, July)
; het laat ook Reason = 'D'
. vallen volledig, omdat niet aan de toetredingsvoorwaarde is voldaan (en elders aan alle drie de maanden is voldaan):
| REASON | MONTH | ------------------ | A | May | | A | May | | B | May | | A | June | | B | June | | A | July |
Terwijl je kon het verlies van Reason = 'D'
. oplossen door toe te voegen
OR a.Month IS NULL
aan uw deelnamevoorwaarde, produceert u nog steeds geen (B, July)
. In plaats daarvan, omdat u elk paar (Reason, Month)
. wilt verkrijgen , je moet CROSS JOIN
uw gematerialiseerde Reasons
tabel met uw gerealiseerde Months
tafel:
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 |
Bekijk het op sqlfiddle .
U hoeft dan alleen het resultaat met uw onderliggende gegevens te verbinden:
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) |
Bekijk het op sqlfiddle .