Din första yttre koppling , som förväntat, producerar:
| REASON | MONTH | ------------------- | A | May | | A | May | | A | July | | A | June | | B | May | | B | June | | D | (null) |
Men eftersom yttre kopplingar ger resultat om kopplingsvillkoret är uppfyllt minst en gång (och introducera bara NULL
registrerar om villkoret är aldrig nöjd), din andra yttre koppling
sedan inte skapa en post för (B, July)
; den tappar också Reason = 'D'
helt och hållet eftersom anslutningsvillkoret inte är uppfyllt (och alla tre månader har uppfyllts någon annanstans):
| REASON | MONTH | ------------------ | A | May | | A | May | | B | May | | A | June | | B | June | | A | July |
Medan du kunde lösa förlusten av Reason = 'D'
genom att lägga till
OR a.Month IS NULL
till ditt anslutningsvillkor kommer du fortfarande inte att producera (B, July)
. Istället för att du vill få varje par av (Reason, Month)
, du måste CROSS JOIN
dina materialiserade Reasons
tabell med din materialiserade Months
tabell:
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 behöver då bara sammanfoga resultatet med dina underliggande 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 .