Gabungan luar pertama Anda , seperti yang diharapkan, menghasilkan:
| REASON | MONTH | ------------------- | A | May | | A | May | | A | July | | A | June | | B | May | | B | June | | D | (null) |
Namun, karena outer join menghasilkan hasil jika kondisi join terpenuhi setidaknya sekali (dan hanya memperkenalkan NULL
mencatat jika kondisinya tidak pernah puas), gabungan luar kedua Anda
maka tidak menghasilkan catatan untuk (B, July)
; itu juga menjatuhkan Reason = 'D'
seluruhnya, karena kondisi bergabung tidak terpenuhi (dan ketiga bulan telah dipenuhi di tempat lain):
| REASON | MONTH | ------------------ | A | May | | A | May | | B | May | | A | June | | B | June | | A | July |
Sementara Anda bisa mengatasi hilangnya Reason = 'D'
dengan menambahkan
OR a.Month IS NULL
dengan syarat bergabung, Anda tetap tidak akan menghasilkan (B, July)
. Sebaliknya, karena Anda ingin mendapatkan setiap pasangan (Reason, Month)
, Anda harus CROSS JOIN
Reasons
Anda yang terwujud tabel dengan Months
yang Anda wujudkan 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 |
Lihat di sqlfiddle .
Anda kemudian hanya perlu menggabungkan hasil luar dengan data dasar Anda:
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) |
Lihat di sqlfiddle .