如何合并401k与Roth贡献数据行并汇总匹配金额?
问题:合并401k与Roth贡献记录的SQL查询
我有一张包含401k(type为4)和Roth(type为R)贡献及雇主匹配金额的表,表结构及数据如下:
| id | name | contrib | match | type |
|---|---|---|---|---|
| 1 | Joe | 100 | 50 | 4 |
| 2 | Sue | 500 | 30 | 4 |
| 3 | Tom | 150 | 80 | 4 |
| 4 | Fred | 200 | 10 | 4 |
| 5 | Sue | 150 | 5 | R |
| 6 | Jane | 125 | 40 | 4 |
需要编写SQL查询,提取所有用户的贡献金额,若用户同时有401k和Roth贡献,需将其合并到一行并汇总匹配金额,期望输出如下:
| name | contrib (401k) | match (combined) | contrib (roth) |
|---|---|---|---|
| Joe | 100 | 50 | |
| Sue | 500 | 35 | 150 |
| Tom | 150 | 80 | |
| Fred | 200 | 10 | |
| Jane | 125 | 40 |
并非所有用户都有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;
思路说明:
- 条件统计贡献:用
CASE语句筛选对应type的记录,仅对符合条件的contrib求和,无对应类型的用户字段会显示NULL(与期望输出的空值一致)。 - 汇总匹配金额:直接用
SUM(match)将同一用户的所有匹配金额(401k和Roth)累加。 - 分组去重:通过
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
相关产品推荐
相关产品推荐

