2014-03-01 93 views
1

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

表结构如下。

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

。 。在StackOverflow中,您可以通过在每行前放置四个空格来格式化代码和表格(无特殊标签)。您可以通过选择区域并单击编辑窗口上方的“{}”按钮来为区域执行此操作。 –

+0

戈登感谢您的信息... – Nikoli

回答

0

我建议创建拥有所有的日历信息的表或表参数。在这种情况下,它至少需要列WeekEnding。

例如

DECLARE @MyCalendar TABLE 
    (
    WeekEnding date 
    ); 

填充此与您的有效日期周末度假。我也可以制作参数来限制销售数据量,例如@BeginDate和@EndDate。

如果你加入使用“< =”在一周结束日期,那么我相信你会得到你想要的回报:我假设你使用的是SQL 2012

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; 

,但我相信,这将也在2008年工作。我可能会指出另外两件事。首先,将SalesId的COUNT除以不同的代表计数时考虑您的数据类型。你可能得不到你期望的回报,这就是为什么我会把它当作浮动物。其次,你应用数量与我使用的数量略有不同;额外的括号是不需要的。

我有一个简化版SQL Fiddle