计算每日变化和新销售人员

时间:2018-02-13 20:42:56

标签: sql sql-server sum

我有一个包含人物,日期和数量的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

请注意,8/1/16是我数据集中的第一天,所以total = 0,因为没有SalesPerson在前一天销售。另请注意,希拉开始在8/3销售,这意味着8/3销售额不会计入8/3数量或变化。但是,在确定8/4变化时,Sheila的8/3销售量为9个单位用于确定1个联合的正确总变化为8/4。

2)我想每天在一行上突破新SalesPersons的总数。如果未添加新的Salespersons,则日期将显示为零。

 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的详细信息,例如新SalesPerson开始销售的日期以及当天销售的数量。

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

SQL Server中是否可以使用这3个输出?

2 个答案:

答案 0 :(得分:1)

我解决了以下问题:

查询#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

答案 1 :(得分:1)

如果您使用的是sql server 2012或更高版本,则可以使用LAG()。你得到了"更改" 。你可以弄清楚其余部分。

查询#1:

. venv/bin/activate
pip install ....

以下是Fiddlle链接。