我有一个包含客户月度统计信息的表格。 列是CustNo,Year,Month,Trips
有些客户在几个月内没有任何旅行,因此CustNo,Year和Month的组合在该表中没有任何行。
我正在尝试编写一个查询,显示0表示没有旅行的CustNo,Year和Month组合,而不是生成空行。
首先,我创建了一个ValidPeriods表,其中包含Year和Month列,其中包含有效的句点。 然后,我可以像这样查询:
SELECT v.ValidYear, v.ValidMonth, tc.CustNo, tc.Trips
FROM ValidPeriods v
LEFT OUTER JOIN TempTrips AS tc ON v.ValidYear = tc.Year
AND v.ValidMonth = tc.Month
WHERE tc.CustNo IN (1001230, 1001286, 1001292)
这将为我提供所有期间的行,其中1行为NULL值,表示列表中没有任何行程的客户。
但是如何为所有期间的列表中的每个客户获得一行?
理想情况下我想要这个:
2016 1 1001230 0
2016 1 1001286 14
2016 1 1001292 23
2016 2 1001230 7
2016 2 1001286 0
2016 2 1001292 4
等...
答案 0 :(得分:3)
使用cross join
生成行。然后使用left join
填写值:
SELECT ym.ValidYear, ym.ValidMonth, c.CustNo, COALESCE(tt.Trips, 0)
FROM ValidPeriods ym CROSS JOIN
(VALUES (1001230), (1001286), (1001292)) c(CustNo) LEFT JOIN
TempTrips tt
ON tt.ValidYear = ym.ValidYear AND tt.ValidMOnth = ym.ValidMonth AND
tt.CustNo = c.CustNo;