长时间潜伏,但第一次发布;我无法独自完成这项工作,或者在任何可以解决这个问题的地方找到答案。
我有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。
答案 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
以获得真正的外部联接行为。