Tham gia bên ngoài đầu tiên của bạn , như mong đợi, tạo ra:
| REASON | MONTH | ------------------- | A | May | | A | May | | A | July | | A | June | | B | May | | B | June | | D | (null) |
Tuy nhiên, vì các phép nối bên ngoài tạo ra kết quả nếu điều kiện nối được thỏa mãn ít nhất một lần (và chỉ giới thiệu NULL
ghi lại nếu điều kiện là không bao giờ hài lòng), tham gia bên ngoài thứ hai của bạn
thì không tạo bản ghi cho (B, July)
; nó cũng giảm Reason = 'D'
hoàn toàn, bởi vì điều kiện tham gia không được đáp ứng (và cả ba tháng đã được thỏa mãn ở nơi khác):
| REASON | MONTH | ------------------ | A | May | | A | May | | B | May | | A | June | | B | June | | A | July |
Trong khi bạn có thể giải quyết việc mất Reason = 'D'
bằng cách thêm
OR a.Month IS NULL
với điều kiện tham gia của bạn, bạn vẫn sẽ không tạo ra (B, July)
. Thay vào đó, vì bạn muốn có được mọi cặp (Reason, Month)
, bạn phải CROSS JOIN
Reasons
cụ thể hóa của bạn bảng với Months
được hiện thực hóa của bạn bảng:
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 |
Xem nó trên sqlfiddle .
Sau đó, bạn chỉ cần kết hợp bên ngoài kết quả với dữ liệu cơ bản của bạn:
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) |
Xem nó trên sqlfiddle .