You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按年份获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:01:43