如何在MySQL中基于多列实现销售数据的累计求和?
实现员工年度累计销售额的SQL方案
现有如下sales表结构及数据:
CREATE TABLE sales( id serial PRIMARY KEY, sales_employee VARCHAR(50) NOT NULL, fiscal_year INT NOT NULL, sale DECIMAL(14,2) NOT NULL ); INSERT INTO sales(sales_employee,fiscal_year,sale) VALUES('Bob',2016,100), ('Bob',2017,150), ('Bob',2018,200), ('Alice',2016,150), ('Alice',2017,100), ('Alice',2018,200), ('John',2016,200), ('John',2017,150), ('John',2018,250);
需要得到每个员工截至对应财年的累计销售额(比如Bob2017年的数值是2016+2017的销售额之和),目标结果如下:
2016 Bob 100 2016 Alice 150 2016 John 200 2017 Bob 250 2017 Alice 250 2017 John 350 2018 Bob 450 2018 Alice 450 2018 John 600
实现方案
用PostgreSQL的窗口函数SUM() OVER()就能轻松解决,核心是按员工分组,按财年排序后计算累计求和:
SELECT fiscal_year, sales_employee, SUM(sale) OVER ( PARTITION BY sales_employee ORDER BY fiscal_year ) AS cumulative_sale FROM sales ORDER BY fiscal_year, sales_employee;
代码解释
PARTITION BY sales_employee:把数据按员工分组,每个员工的计算独立进行ORDER BY fiscal_year:在每个员工组内,按财年从小到大排序SUM(sale) OVER (...):对每个员工组内的销售额,从最早财年开始累计求和,得到截至当前财年的总销售额
这个方案支持任意数量的员工和财年,不用修改代码就能适配实际场景的大数据量。
内容的提问来源于stack exchange,提问作者ogbofjnr
相关产品推荐
相关产品推荐

