Din første ydre join producerer som forventet:
| REASON | MONTH | ------------------- | A | May | | A | May | | A | July | | A | June | | B | May | | B | June | | D | (null) |
Men fordi ydre joinforbindelser giver resultater, hvis join-betingelsen er opfyldt mindst én gang (og indfør kun NULL
registrerer, hvis betingelsen er aldrig tilfreds), din anden ydre joinforbindelse
så ikke producere en post for (B, July)
; den taber også Reason = 'D'
helt, fordi sammenføjningsbetingelsen ikke er opfyldt (og alle tre måneder er blevet opfyldt andre steder):
| REASON | MONTH | ------------------ | A | May | | A | May | | B | May | | A | June | | B | June | | A | July |
Mens du kunne løse tabet af Reason = 'D'
ved at tilføje
OR a.Month IS NULL
til din deltagelsesbetingelse vil du stadig ikke producere (B, July)
. I stedet fordi du ønsker at få hvert par (Reason, Month)
, skal du CROSS JOIN
dine materialiserede Reasons
tabel med din materialiserede Months
tabel:
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 |
Se den på sqlfiddle .
Du skal så blot ydre sammenføj resultatet med dine underliggende data:
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) |
Se den på sqlfiddle .