Вашето първо външно присъединяване , както се очаква, произвежда:
<преди>| ПРИЧИНА | МЕСЕЦ |-------------------| A | май || A | май || A | юли || A | юни || B | май || B | юни || D | (null) |
Въпреки това, тъй като външните съединения дават резултати, ако условието за свързване е изпълнено поне веднъж (и въведе само NULL
записва, ако условието е никога доволен), вашето второ външно присъединяване
тогава не създайте запис за (B, July)
; също изпуска Reason = 'D'
изцяло, защото условието за присъединяване не е изпълнено (и всичките три месеца са изпълнени другаде):
Докато можехте разреши загубата на 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
<преди>| ПРИЧИНА | МЕСЕЦ |------------------| A | май || B | май || D | май || A | юни || B | юни || D | юни || A | юли || B | юли || D | юли | Вижте го на 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
<преди>| ПРИЧИНА | МЕСЕЦ | ПРЕСТОЙ |-----------------------------| A | юли | 3 || A | юни | 8 || A | май | 7 || B | юли | (нула) || B | юни | 6 || B | май | 5 || D | юли | (нула) || D | юни | (нула) || D | май | (null) | Вижте го на sqlfiddle .