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

如何合并401k与Roth贡献数据行并汇总匹配金额?

问题:合并401k与Roth贡献记录的SQL查询

我有一张包含401k(type为4)和Roth(type为R)贡献及雇主匹配金额的表,表结构及数据如下:

idnamecontribmatchtype
1Joe100504
2Sue500304
3Tom150804
4Fred200104
5Sue1505R
6Jane125404

需要编写SQL查询,提取所有用户的贡献金额,若用户同时有401k和Roth贡献,需将其合并到一行并汇总匹配金额,期望输出如下:

namecontrib (401k)match (combined)contrib (roth)
Joe10050
Sue50035150
Tom15080
Fred20010
Jane12540

并非所有用户都有Roth贡献,若有则需与401k贡献合并到一行。我尝试过group_by、sum()、max()、min()、连接、联合等方法,但始终无法将Sue的记录合并为一行,恳请提供解决方案。


解决方案

可以使用条件聚合实现需求,通过GROUP BY name分组,针对不同type分别统计对应贡献金额,同时汇总所有匹配金额:

SELECT
    name,
    SUM(CASE WHEN type = '4' THEN contrib ELSE NULL END) AS `contrib (401k)`,
    SUM(match) AS `match (combined)`,
    SUM(CASE WHEN type = 'R' THEN contrib ELSE NULL END) AS `contrib (roth)`
FROM
    your_table_name
GROUP BY
    name;

思路说明:

  1. 条件统计贡献:用CASE语句筛选对应type的记录,仅对符合条件的contrib求和,无对应类型的用户字段会显示NULL(与期望输出的空值一致)。
  2. 汇总匹配金额:直接用SUM(match)将同一用户的所有匹配金额(401k和Roth)累加。
  3. 分组去重:通过GROUP BY name确保每个用户仅输出一行记录。

如果你的数据库对NULL求和有特殊处理,也可以用ELSE 0替代ELSE NULL,再通过外层CASE将0转为空值,效果一致:

SELECT
    name,
    CASE WHEN SUM(CASE WHEN type = '4' THEN contrib ELSE 0 END) > 0 
         THEN SUM(CASE WHEN type = '4' THEN contrib ELSE 0 END) 
         ELSE NULL END AS `contrib (401k)`,
    SUM(match) AS `match (combined)`,
    CASE WHEN SUM(CASE WHEN type = 'R' THEN contrib ELSE 0 END) > 0 
         THEN SUM(CASE WHEN type = 'R' THEN contrib ELSE 0 END) 
         ELSE NULL END AS `contrib (roth)`
FROM
    your_table_name
GROUP BY
    name;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:35:36