销售额按年度分组

时间:2014-03-01 14:53:13

标签: sql sql-server

我要求以每周格式输出一年中的销售数量,其中星期一是一周的第一天,星期日是最后一天。

表结构如下。

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

请原谅上表格式。我似乎无法弄清楚如何使用编辑器创建基于管道/换行的表。

〜尼克

1 个答案:

答案 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中有一个简化版本。