正确加入CTE_dates不返回所有日期

时间:2015-07-06 06:44:51

标签: sql sql-server-2012 common-table-expression right-join

长时间潜伏,但第一次发布;我无法独自完成这项工作,或者在任何可以解决这个问题的地方找到答案。

我有table1,包括列部门,销售,日期。 每行记录销售。

我希望查询按部门(使用Sum())返回销售的最后7天(周末包括),没有销售的日期(没有日期记录)仍返回值为0)。

目前我使用CTE生成过去7天的日期列表,代码如下:

DECLARE @startDate datetime, @endDate datetime; 

SET @startDate = DateAdd(day, -6, GetDate()); 
SET @endDate   = GetDate(); 

WITH [dates_CTE] ([date]) AS 
   (SELECT @startDate AS [date] 
    UNION ALL 
    SELECT DATEADD(d, 1, [date]) AS [date] 
    FROM [dates_CTE]
    WHERE [date] < @endDate) 

--This part just to show contents of CTE, not used in full code
SELECT [date], CONVERT(date, [date])
FROM [dates_CTE]
ORDER BY [date] DESC

从源代码修改:https://gallery.technet.microsoft.com/scriptcenter/97fe6de5-ab27-40db-8565-637988f028a2

现在我正在尝试使用此代码从Table1中选择数据,并为缺少的日期包含一行,其中销售值应为NULL(一旦我开始工作,我将只使用ISNULL更改为0) :

SELECT SUM([Table1].[sales]) AS 'Total Sales', CONVERT(date, [Table1].[date]) AS 'Date'
FROM [Table1]
RIGHT JOIN [dates_CTE]
ON CONVERT(date, [Table1].[date]) = CONVERT(date, [dates_CTE].[date])
WHERE [Department] = 'ELC'
GROUP BY CONVERT(date, [Table1].[date])
ORDER BY CONVERT(date, [Table1].[date]) DESC

您可能会注意到我已经使用CONVERT(日期)功能稍微超过了顶部。 这是因为Table1.date只记录日期,并在时间内全部放入零;即YYYY-MM-DD 00:00:00.000。 我的CTE得到了当前的日期时间,显然在时间上会有零以外的东西;所以我使用CONVERT将它们都转换为日期并忽略时间,因为它们无关紧要。

无论我做什么(我已经玩过不同的联接,而不是使用CONVERT(日期),都无济于事。 输出似乎总是一样的;它只返回带有值的5条记录,当我需要2条时,它应该只读取null / 0。

1 个答案:

答案 0 :(得分:1)

列[部门]属于哪个表?

如果它是[表1]列,请将[Department] = 'ELC'条件从WHERE移至ON,即

SELECT SUM([Table1].[sales]) AS 'Total Sales',
       CONVERT(date, [Table1].[date]) AS 'Date'
FROM [Table1]
RIGHT JOIN [dates_CTE]
ON CONVERT(date, [Table1].[date]) = CONVERT(date, [dates_CTE].[date])
   AND [Department] = 'ELC'
GROUP BY CONVERT(date, [Table1].[date])
ORDER BY CONVERT(date, [Table1].[date]) DESC

如果条件在WHERE中,则外连接将作为常规内连接执行。移至ON以获得真正的外部联接行为。