1

长期潜伏但第一次发帖;我一辈子都无法自己解决这个问题,或者在任何地方找到解决这个问题的答案。

我有 table1 列部门、销售、日期。每行记录一次销售。

我想要一个查询按部门返回最近 7 天(包括周末)的销售(使用 Sum()),其中没有进行销售的天数(该日期没有记录)仍然返回值为 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(date,) 函数时有点过头了。这是因为 Table1.date 只记录了日期,时间全为零;即 YYYY-MM-DD 00:00:00.000。我的 CTE 得到的是当前的日期时间,很明显,它的时间不是零;所以我使用 CONVERT 将它们都变成日期并忽略时间,因为它们无关紧要。

无论我似乎在做什么(我玩过不同的连接,而不是使用 CONVERT(date,),但无济于事。输出似乎总是相同的;它只返回 5 条带值的记录,当我还需要 2 个,应该只是读取 null/0。

4

1 回答 1

1

[部门] 列属于哪个表?

如果是 [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

如果条件为 in WHERE,则外连接作为常规内连接执行。移动以ON获得真正的外部连接行为。

于 2015-07-06T06:54:38.813 回答