我有一个包含人物,日期和数量的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个输出?
答案 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链接。