我要求以每周格式输出一年中的销售数量,其中星期一是一周的第一天,星期日是最后一天。
表结构如下。
SalesId |代表| DateOfSale。
以下是我的尝试,但它似乎没有给我正确的结果。在给定的一周内,计数似乎没有增加。周日结果不包括在正确的一周内。我认为这与日期不一致,包括本周最后一天的11:59:59.999。
SELECT DATEADD(wk, DATEDIFF(wk, 6, Sales.DateOfSale), 6) as [Week Ending], count(SalesID) as Sales,
count(distinct(representative)) as Agents, count(SalesID) / count(distinct(representative)) as SPA
FROM Sales
where DateOfSale >= DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
GROUP BY DATEADD(wk, DATEDIFF(wk, 6, Sales.DateOfSale), 6)
ORDER BY DATEADD(wk, DATEDIFF(wk, 6, Sales.DateOfSale), 6)
我希望有这样的东西:
Week Ending | Sales
01/05/2014 | 5
01/12/2014 | 8
01/19/2014 | 11
01/26/2014 | 14
请原谅上表格式。我似乎无法弄清楚如何使用编辑器创建基于管道/换行的表。
〜尼克
答案 0 :(得分:0)
我建议创建一个包含所有日历信息的表或表参数。在这种情况下,它至少需要一个WeekEnding列。
例如
DECLARE @MyCalendar TABLE
(
WeekEnding date
);
使用有效的WeekEnding日期填充此内容。我也可以制作参数来限制销售数据量,例如: @BeginDate和@EndDate。
如果您在周结束日期使用“< =”加入,那么我相信您会得到您想要的回报:
SELECT
MyCalendar.WeekEnding,
COUNT(Sales.SalesId) Sales,
COUNT(DISTINCT Sales.Representative) Agents,
CAST(COUNT(Sales.SalesId) AS float) / CAST(COUNT(DISTINCT Sales.Representative) AS float) Spa
FROM
Sales
INNER JOIN
@MyCalendar MyCalendar
ON
Sales.DateOfSale <= MyCalendar.WeekEnding
WHERE
Sales.DateOfSale BETWEEN @BeginDate AND @EndDate
GROUP BY
MyCalendar.WeekEnding;
我假设您使用的是SQL 2012,但我相信这也适用于2008年。我可能会指出另外两件事。首先,在将SalesId的COUNT除以代表的不同计数时考虑您的数据类型。你可能得不到你期望的回报,这就是我作为浮动投的原因。其次,你应用的计数与我使用的略有不同;不需要额外的括号。
我在SQL Fiddle中有一个简化版本。