如何编写SQL查询,基于列值求和计数,按需求展示各年份对应2017年计数总和
按年份累计求和的SQL解决方案
嘿,针对你需要计算每个YOA年份到2017年的计数总和这个需求,我整理了两种实用的SQL写法,适配不同的数据库环境:
方法一:窗口函数(推荐,适用于MySQL 8.0+、PostgreSQL、SQL Server等现代数据库)
窗口函数是实现这类累计计算最简洁高效的方式,代码如下:
SELECT DISTINCT YOA, CONCAT(YOA, ' - ', SUM(Count) OVER (ORDER BY YOA DESC RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)) AS year_total FROM your_dataset;
关键逻辑说明
SUM(Count) OVER (ORDER BY YOA DESC RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING):按YOA从大到小排序后,窗口范围是当前行到最后一行(也就是2017年的数据),这样求和就得到了当前年份到2017年的所有计数总和。DISTINCT:原数据中同一个YOA对应多条记录,去重后就能得到每个年份唯一的结果行。
方法二:子查询自连接(兼容旧版数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x版本),可以用自连接加分组的方式实现:
SELECT t1.YOA, CONCAT(t1.YOA, ' - ', SUM(t2.Count)) AS year_total FROM your_dataset t1 INNER JOIN your_dataset t2 ON t2.YOA >= t1.YOA GROUP BY t1.YOA ORDER BY t1.YOA DESC;
逻辑拆解
- 通过自连接,让每个
t1.YOA匹配所有大于等于它的t2.YOA,这样t2集合就包含了当前年份及之后(直到2017)的所有数据。 - 对
t2.Count求和后按t1.YOA分组,就能得到每个年份对应的累计总和。
测试结果验证
用你提供的数据集运行上述SQL,会得到如下输出:
2017 - 185
2016 - 291
2015 - 482
2014 - 663
(计算过程:2016年总和=47+26+33+185=291;2015年总和=191+291=482;2014年总和=43+2+17+119+482=663)
内容的提问来源于stack exchange,提问作者TechHero
相关产品推荐
相关产品推荐

