你的第一个外部连接 http://www.sqlfiddle.com/#!2/8479e/19/0正如预期的那样,产生:
| REASON | MONTH |
-------------------
| A | May |
| A | May |
| A | July |
| A | June |
| B | May |
| B | June |
| D | (null) |
但是,因为如果满足连接条件,外连接就会产生结果至少一次(并且只介绍NULL
记录如果条件是never使满意),你的第二个外部连接 http://www.sqlfiddle.com/#!2/8479e/20/0 then does not产生一个记录(B, July)
;它也会下降Reason = 'D'
完全是这样,因为未满足连接条件(并且所有三个月都已在其他地方满足):
| REASON | MONTH |
------------------
| A | May |
| A | May |
| B | May |
| A | June |
| B | June |
| A | July |
当你could解决损失Reason = 'D'
通过增加 http://www.sqlfiddle.com/#!2/8479e/21/0 OR a.Month IS NULL
根据您的加入条件,您仍然不会产生(B, July)
。相反,因为你想获得每一对(Reason, Month)
, 你必须CROSS JOIN
你的物化Reasons
与你的物化表Months
table:
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 |
看到它sqlfiddle http://www.sqlfiddle.com/#!9/8479e/1/0.
然后,您只需将结果与基础数据进行外部联接:
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) |
看到它sqlfiddle http://www.sqlfiddle.com/#!9/8479e/2/0.