【问题标题】:Sales Grouped by Week of the year按一年中的周分组的销售额
【发布时间】:2014-03-01 14:53:12
【问题描述】:

我需要以每周格式输出一年至今的销售额,其中星期一是一周的第一天,星期日是最后一天。

表结构如下。

销售 ID |代表 |销售日期。

以下是我尝试过的,但似乎没有给我正确的结果。给定一周的计数似乎没有加起来。周日结果不包括在正确的周内。我认为这与日期有关,不包括一周最后一天的 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

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

~尼克

【问题讨论】:

  • 。 .在 StackOverflow 中,您只需在每行前面放置四个空格(无特殊标签)即可格式化代码和表格。您可以通过选择区域并单击编辑窗口上方的{} 按钮来对区域执行此操作。
  • 戈登感谢您提供的信息...

标签: sql sql-server


【解决方案1】:

我建议创建一个包含所有日历信息的表格或表格参数。在这种情况下,它至少需要 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 除以代表的不同计数时,请考虑您的数据类型。你可能得不到你期望的回报,这就是为什么我选择浮动。其次,您应用 count distinct 与我使用的略有不同;不需要额外的括号。

我在SQL Fiddle有一个简化版。

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    相关资源
    最近更新 更多