Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/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_Cumulative Sum_Distinct Values - Fatal编程技术网

具有不同元素的SQL表中的累积和查询

具有不同元素的SQL表中的累积和查询,sql,cumulative-sum,distinct-values,Sql,Cumulative Sum,Distinct Values,我有一个这样的表,列名称作为销售日期和保险业务员姓名- 我想用销售日期做一个分组。下一列应显示截至该日期已完成销售的卖家的累计数量。但同样的卖家不应该再被考虑 比如说,, 下表不正确 Date of Sale | Count(Salesman Name) | Sum(Sale Amount) 2021-03-01 | 1 | 40 2021-03-02 | 3 | 200 2021-03-03 | 5

我有一个这样的表,列名称作为销售日期和保险业务员姓名-

我想用销售日期做一个分组。下一列应显示截至该日期已完成销售的卖家的累计数量。但同样的卖家不应该再被考虑

比如说,, 下表不正确

Date of Sale | Count(Salesman Name) | Sum(Sale Amount)
2021-03-01   | 1                    | 40
2021-03-02   | 3                    | 200
2021-03-03   | 5                    | 300  
下表是正确的

Date of Sale | Count(Salesman Name) | Sum(Sale Amount)
2021-03-01   | 1                    | 40
2021-03-02   | 3                    | 200
2021-03-03   | 3                    | 300
我不确定如何构建SQL查询,因为这里涉及两个条件,即忽略重复项的累积计数。我认为OVER子句和前面的无界行在这里可能有一些用处?请求你的帮助


编辑-我已将销售金额添加为一列。我还需要销售金额的累计金额。但在这种情况下,应考虑所有销售金额,而不是只考虑唯一名称的销售人员姓名情况。

一种方法使用自联接和聚合:

以cte为例 选择t1.SaleDate, COUNTCASE当t2.saller为空时,则1结束为cnt, SUMt1.SaleAmount作为金额 从您的表t1 左键连接您的表t2 关于t2.saller=t1.Saleman和 t2.SaleDateCTE的逻辑是,我们试图为每个销售人员找到同一销售人员的早期记录。如果我们找不到这样一个记录,那么我们假设这个记录是第一次出现。然后,我们按日期聚合以获得每天的计数,最后在外部查询中获取计数的滚动总和。

最好的方法是使用窗口函数来确定销售人员第一次出现的时间。然后,您只需要累计总和:

select saledate,
       sum(case when seqnum = 1 then 1 else 0 end) over (order by saledate) as num_salespersons,
       sum(sum(sales)) over (order by saledate) as running_sales
from (select t.*,
             row_number() over (partition by salesperson order by saledate) as seqnum
      from t
     ) t
group by saledate
order by saledate;

请注意,除了更简洁之外,这应该比使用自连接的解决方案具有更好的性能。

嘿,蒂姆,谢谢你的回答。我在表中又添加了一列。您能否建议在查询中需要进行的更改,以便合并销售金额列?顺便说一句,感谢您的精彩解释。嘿,这会忽略重复的销售人员姓名,而不会忽略任何销售金额行吗?当然,我们会接受答案,一旦问题解决,问题解决,重新加载页面。请指定正在使用的dbms。不同的供应商支持不同的功能。嘿,谢谢你的回答。提供了一种解决复杂查询的全新方法。有没有学习窗口函数的好资源?我建议您从所使用的数据库的文档开始。
select saledate,
       sum(case when seqnum = 1 then 1 else 0 end) over (order by saledate) as num_salespersons,
       sum(sum(sales)) over (order by saledate) as running_sales
from (select t.*,
             row_number() over (partition by salesperson order by saledate) as seqnum
      from t
     ) t
group by saledate
order by saledate;