Il tuo primo outer join , come previsto, produce:
| REASON | MONTH | ------------------- | A | May | | A | May | | A | July | | A | June | | B | May | | B | June | | D | (null) |
Tuttavia, poiché i join esterni producono risultati se la condizione di join è soddisfatta almeno una volta (e introduci solo NULL
record se la condizione è mai soddisfatto), il tuo secondo outer join
allora non produrre un record per (B, July)
; rilascia anche Reason = 'D'
interamente, perché la condizione di adesione non è soddisfatta (e tutti e tre i mesi sono stati soddisfatti altrove):
| REASON | MONTH | ------------------ | A | May | | A | May | | B | May | | A | June | | B | June | | A | July |
Mentre tu potresti risolvere la perdita di Reason = 'D'
aggiungendo
OR a.Month IS NULL
alla tua condizione di adesione, non produrrai ancora (B, July)
. Invece, perché vuoi ottenere ogni coppia di (Reason, Month)
, devi CROSS JOIN
le tue Reasons
materializzate tabella con i tuoi Months
materializzati tabella:
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 |
Guardalo su sqlfiddle .
Quindi devi semplicemente unire il risultato con i tuoi dati sottostanti:
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) |
Guardalo su sqlfiddle .