【问题标题】:Calculating Daily Change and New Salespersons计算每日变化和新销售人员
【发布时间】:2018-07-24 07:46:57
【问题描述】:

我有一个包含人员、日期和数量的 SALES 表:

Person    Date       Qty
Bob     2016-08-01    5
Bob     2016-08-02    2
Bob     2016-08-03    6
Bob     2016-08-04    4
Jim     2016-08-01    1
Jim     2016-08-02    3
Jim     2016-08-03    2
Jim     2016-08-04    2
Sheila  2016-08-03    9
Sheila  2016-08-04   12

我想产生 3 个输出

1) 前一天销售人员的每日总数量变化:

  Date       Qty    Change     Pct Change
2016-08-01    0       0             0.00    
2016-08-02    5      -1           -16.66
2016-08-03    8       3            60.00
2016-08-04    18      1             5.88

请注意,2016 年 8 月 1 日是我数据集中的第一天,因此总计 = 0,因为前一天没有销售人员在销售。另请注意,Sheila 于 8/3 开始销售,这意味着此处 8/3 的销售额并未计入 8/3 的数量或变化。但是,在确定 8/4 变化时,Sheila 的 8/3 销售 9 个单位用于确定 8/4 的 1 个单位的正确总变化。

2) 我想每天在一行中列出新销售人员的总数。如果没有添加新的销售人员,则日期将显示为零。

 Date      New Qty
2016-08-01    6
2016-08-02    0
2016-08-03    9
2016-08-04    0

由于 8 月 1 日是任何人销售的第一天,因此 Bob 和 Jim 的销售都包含在 8 月 1 日的新数量 6 中。

3) 最终输出显示 #2 的详细信息,例如新销售人员开始销售的日期以及当天销售的数量。

  Date       Person  New Qty
2016-08-01    Bob       5
2016-08-01    Jim       1
2016-08-03    Sheila    9

这 3 个输出在 SQL Server 中是否可能?

【问题讨论】:

  • 是的。一切皆有可能。第一个和第二个有点复杂,但可以做到。
  • 你试过什么?向我们展示您当前的查询尝试。
  • 什么版本的 SQL Server?

标签: sql sql-server sum


【解决方案1】:

如果您使用的是 sql server 2012 或更高版本,则可以使用 LAG()。你得到了“改变”。剩下的你可以自己想办法了。

查询 #1:

 SELECT
      dt.DateVal,
      SUM(CASE WHEN dt.PreviousQuota = 0 THEN 0 ELSE dt.PreviousQuotadd END)  Change
    FROM
    (
    SELECT
    Id,
    Person,
    DateVal,
    Qty,
     LAG(Qty, 1,0) OVER ( PARTITION BY Person ORDER BY DateVal) AS PreviousQuota ,
     LEAD(Qty, 1,0) OVER ( PARTITION BY Person ORDER BY DateVal) AS NextQuota  ,
    LAG(Qty, 1,0) OVER ( PARTITION BY Person ORDER BY DateVal) AS PreviousQuotad ,
    (Qty -  LAG(Qty, 1,0) OVER ( PARTITION BY Person ORDER BY DateVal)) AS PreviousQuotadd
    FROM Table1
    ) AS dt

这是Fiddlle 链接。

【讨论】:

  • Prabhath,SQL 无法识别 dateval。 SQL Server 2012 是否有等效命令?
  • 我将表中的“日期”列称为 DateVal。试试链接sqlfiddle.com/#!18/e37b5/11
【解决方案2】:

我解决了以下问题:

查询 #2:

WITH CTE_1 AS 
 (Select DISTINCT Date FROM [master].[dbo].[Sales] GROUP BY Date)
, CTE_2 AS 
 (select Person,Date,ROW_NUMBER() OVER(Partition By Person Order By Date) as RowNum, SUM(Qty) as  [PersonDailySum]
FROM [master].[dbo].[Sales]
GROUP BY Person,Date)
,CTE_3 AS(
SELECT T0.date, SUm([PersonDailySum]) As [New Qty]
FROM CTE_1 T0 
LEFT JOIN CTE_2 T1 
ON T0.Date = T1.date AND T1.RowNum = 1
GROUP BY T0.Date)
SELECT Date, ISNULL([New Qty],0) AS [New Qty] FROM CTE_3

查询 #3

SELECT Date,Person,SUM([PersonDailySum]) AS [New Qty] FROM (
select Person,Date,ROW_NUMBER() OVER(Partition By Person Order By Date) as RowNum, SUM(Qty) as  [PersonDailySum]
FROM [master].[dbo].[Sales]
GROUP BY Person,Date) T0
WHERE T0.RowNum = 1
GROUP BY Date,Person

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-11
    • 2012-04-08
    • 2022-11-22
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多