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

SQLite 3:实现列值求和并获取对应最后年份的列值

解决SQL分组统计同时获取指定年份值的问题

数据表与需求

给定names表数据:

Name      Value     Year
------------------------
John      5         2021
John      10        2022
John      6         2023
Kat       20        2021
Kat       10        2022
Kat       12        2023  

需要输出每个Name的Value总和,以及对应指定年份(示例为2023,将替换为变量)的Value值,结果如下:

Name      Total     LastYear
----------------------------
Kat       42        12
John      21        6

现有代码与问题

已实现前两列的SQL:

select name, sum(value) as Total from names group by name order by sum(value) desc

需要补充获取指定年份Value的LastYear列。

解决方案

方法1:条件聚合(通用适配多数SQL方言)

通过CASE WHEN筛选目标年份的Value,结合聚合函数提取对应值:

SELECT 
    name,
    SUM(value) AS Total,
    MAX(CASE WHEN Year = :target_year THEN Value END) AS LastYear
FROM names
GROUP BY name
ORDER BY Total DESC;
  • 说明:MAX用于提取目标年份的Value,因为每个Name对应目标年份仅一条记录,使用SUM/AVG也可得到相同结果;:target_year替换为实际变量,不同数据库变量写法有差异(如MySQL用@target_year,SQL Server用@target_year,PostgreSQL用$1)。

方法2:子查询关联

先统计总和,再关联目标年份的记录获取对应值:

SELECT 
    main.name,
    main.Total,
    last_year.Value AS LastYear
FROM (
    SELECT name, SUM(value) AS Total 
    FROM names 
    GROUP BY name
) main
LEFT JOIN (
    SELECT name, Value 
    FROM names 
    WHERE Year = :target_year
) last_year ON main.name = last_year.name
ORDER BY main.Total DESC;
  • 说明:使用LEFT JOIN可保证即使某个Name在目标年份无数据,仍能保留其总和记录,此时LastYear为NULL;若确认所有Name都有目标年份数据,可替换为INNER JOIN。

内容的提问来源于stack exchange,提问作者baphomet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:17:12