右加入 CTE_dates 不返回所有日期

Right Join to CTE_dates not returning all dates

潜伏已久但第一次发帖;我一辈子都无法独自解决这个问题,也无法在任何地方找到解决这个问题的答案。

我有包含部门、销售和日期列的表 1。 每行记录一次销售。

我想按部门(使用 Sum())查询 return 最近 7 天(包括周末)的销售额,其中没有销售额的日子(没有日期记录)仍然 returned 值为 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

现在我正在尝试使用此代码来 select 表 1 中的数据,并包括一个缺失日期的行,其中销售值应为 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(date,) 函数有点过了头。 这是因为Table1.date只记录日期,时间全0;即 YYYY-MM-DD 00:00:00.000。 我的 CTE 得到的是当前日期时间,很明显,时间中会有除零之外的其他内容;所以我使用 CONVERT 将它们都变成日期并忽略时间,因为它们是不相关的。

无论我似乎在做什么(我尝试过不同的连接,但没有使用 CONVERT(date,),但无济于事。 输出似乎总是一样的;它只有 returns 5 个带值的记录,当我还需要 2 个时,应该只读 null/0.

[部门]列属于哪个table?

如果是 [Table1] 列,将 [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 以获得真正的外部连接行为。