Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算每日变化和新销售人员_Sql_Sql Server_Sum - Fatal编程技术网

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。试试这个链接