如何解决SQL表中具有不同元素的累积求和查询
我有一个这样的表格,列名称为销售日期和保险销售人员姓名 -
Date of Sale | Salesman Name | Sale Amount
2021-03-01 | Jack | 40
2021-03-02 | Mark | 60
2021-03-03 | Sam | 30
2021-03-03 | Mark | 70
2021-03-02 | Sam | 100
我想使用销售日期进行分组。下一列应显示截至该日期进行销售的卖家的累计数量。但不应再次考虑相同的卖家。
例如, 下表不正确,
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 子句以及前面的无界行在这里可能有用吗?请求您的帮助
编辑 - 我已将销售金额添加为一列。我还需要销售额的累计金额。但在这种情况下,应考虑所有销售额,这与仅考虑唯一名称的销售员姓名情况不同。
解决方法
一种方法使用自连接和聚合:
WITH cte AS (
SELECT t1.SaleDate,COUNT(CASE WHEN t2.Salesman IS NULL THEN 1 END) AS cnt,SUM(t1.SaleAmount) AS amt
FROM yourTable t1
LEFT JOIN yourTable t2
ON t2.Salesman = t1.Saleman AND
t2.SaleDate < t1.SaleDate
GROUP BY t1.SaleDate
)
SELECT
SaleDate,SUM(cnt) OVER (ORDER BY SaleDate) AS NumSalesman,SUM(amt) OVER (ORDER BY SaleDate) AS TotalAmount
FROM cte
ORDER BY SaleDate;
CTE 中的逻辑是,我们尝试为每个销售员查找同一销售员的较早记录。如果我们找不到这样的记录,那么我们假设有问题的记录是第一次出现。然后我们按日期聚合以获得每天的计数,最后在外部查询中对计数进行滚动求和。
,最好的方法是使用窗口函数来确定销售人员首次出现的时间。然后,您只需要累积总和:
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;
请注意,这除了更简洁之外,还应该比使用自联接的解决方案具有更好的性能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。