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