Sql 计算每日变化和新销售人员
我有一张包含人员、日期和数量的销售表:Sql 计算每日变化和新销售人员,sql,sql-server,sum,Sql,Sql Server,Sum,我有一张包含人员、日期和数量的销售表: 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-
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,因为前一天没有销售人员在销售。还请注意,Sheila从8/3开始销售,这意味着8/3的销售额不会计入8/3的数量或变化。然而,在确定8/4的变化时,Sheila的9个单位的8/3销售额用于确定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
SQL Server中是否可能有这3种输出?我解决了以下问题: 查询#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
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
查询#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
如果使用的是sql server 2012或更高版本,则可以使用LAG()。您得到了“更改”。其余的你都能搞定
查询#1:
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
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
这是链接。是。这一切都是可能的。第一个和第二个有点复杂,但可以做。你试过什么?显示您当前的查询尝试。SQL Server的哪个版本?Prabhath,SQL无法识别dateval。SQL Server 2012是否有等效的命令?我将表中的“Date”列称为DateVal。试试这个链接