Vaše první vnější připojení , jak se očekávalo, produkuje:
| REASON | MONTH | ------------------- | A | May | | A | May | | A | July | | A | June | | B | May | | B | June | | D | (null) |
Protože však vnější spojení produkují výsledky, pokud je podmínka spojení splněna alespoň jednou (a zaveďte pouze NULL
záznamy, pokud je podmínka nikdy spokojen), vaše druhé vnější připojení
pak není vytvořit záznam pro (B, July)
; také vypadne Reason = 'D'
úplně, protože podmínka spojení není splněna (a všechny tři měsíce byly splněny jinde):
| REASON | MONTH | ------------------ | A | May | | A | May | | B | May | | A | June | | B | June | | A | July |
Zatímco mohli vyřešit ztrátu Reason = 'D'
přidáním
OR a.Month IS NULL
k vaší podmínce připojení, stále nevyrobíte (B, July)
. Místo toho, protože chcete získat každý pár (Reason, Month)
, musíte CROSS JOIN
vaše zhmotněné Reasons
tabulka s vašimi zhmotněnými Months
tabulka:
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 |
Podívejte se na sqlfiddle .
Pak potřebujete pouze vnější spojení výsledku s vašimi podkladovými daty:
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) |
Podívejte se na sqlfiddle .