强制查询

时间:2018-04-16 12:22:11

标签: sql sql-server

我有一个包含客户月度统计信息的表格。 列是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

等...

1 个答案:

答案 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;