具有不同元素的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.SaleDate
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;