如何按年份获取SQL统计结果?附数据示例与格式需求
解决方案:实现需求的SQL查询语句
当然可以实现!针对你的需求,我整理了通用的SQL查询语句,同时适配后续逐年新增数据的场景,具体如下:
原始数据表(示例)
假设你的表名为your_table,结构和数据如下:
+---+----+----+----+ | id|year| A | B | +---+----+----+----+ |101|2017| 50 | 40 | |102|2017| 40 | 45 | |103|2017| 80 | 15 | |104|2017| 0 | 0 | |101|2018| 65 | 75 | |102|2018| 50 | 40 | |103|2018| 25 | 55 | |104|2018| 0 | 0 | +---+----+----+----+
目标查询结果
需要输出按id分组,各年份A+B合计、总合计,且仅保留总合计不为0的记录:
+---+--------------+--------------+-------------+ | id|Total for 2017|Total for 2018|Overall Total| +---+--------------+--------------+-------------+ |101| 90 | 140 | 230 | |102| 85 | 90 | 175 | |103| 95 | 80 | 175 | +---+--------------+--------------+-------------+
实现的SQL语句
SELECT id, -- 计算2017年A+B的总和 SUM(CASE WHEN year = 2017 THEN A + B ELSE 0 END) AS `Total for 2017`, -- 计算2018年A+B的总和 SUM(CASE WHEN year = 2018 THEN A + B ELSE 0 END) AS `Total for 2018`, -- 计算所有年份的总合计 SUM(A + B) AS `Overall Total` FROM your_table -- 替换成你的实际表名 GROUP BY id -- 过滤掉总合计为0的id HAVING `Overall Total` > 0;
语句说明
- 行转列统计年份合计:使用
CASE WHEN配合SUM(),仅统计对应年份的A+B值,其他年份贡献0,实现将行数据转为列的效果。 - 总合计计算:直接用
SUM(A + B)汇总所有年份的A+B总和,简单高效。 - 分组与过滤:通过
GROUP BY id确保每个id仅返回一行结果;用HAVING过滤总合计大于0的记录(因为WHERE无法直接过滤聚合后的结果,HAVING是更合适的选择)。
适配后续新增年份
如果后续新增2019、2020等年份的数据,只需要在SELECT中新增对应年份的统计行即可,例如:
SUM(CASE WHEN year = 2019 THEN A + B ELSE 0 END) AS `Total for 2019`
内容的提问来源于stack exchange,提问作者Hasics
相关产品推荐
相关产品推荐

