SQL分组求和与行列转换及多场景扩展问题求助
多维度汇总表实现方案
为啥会出现两行数据?
你把货币判断的CASE语句加到GROUP BY里后,同一date+id下如果同时存在房租支出和其他类型记录,会被拆成两个分组——一个是符合房租条件的实际货币值,一个是不符合条件的'nothing',自然输出两行,和你预期的一行结果不符。
正确写法
用条件聚合就能同时搞定列组合求和、货币列提取,而且不用把货币判断放到GROUP BY里:
示例SQL
假设源表名为transactions,字段包含date, id, exprev, type, amount, Currency, usd_amount(usd_amount为转换后的美元金额):
SELECT date, id, -- 房租支出(本地货币) SUM(CASE WHEN exprev = 'Expense' AND type = 'rent' THEN amount ELSE 0 END) AS [rent expense (local)], -- 房租对应的货币类型 MAX(CASE WHEN exprev = 'Expense' AND type = 'rent' THEN Currency END) AS [rent expense currency], -- 房租支出(USD) SUM(CASE WHEN exprev = 'Expense' AND type = 'rent' THEN usd_amount ELSE 0 END) AS [rent expense (USD)], -- 可扩展其他组合列,比如水电支出 SUM(CASE WHEN exprev = 'Expense' AND type = 'utility' THEN amount ELSE 0 END) AS [utility expense (local)], MAX(CASE WHEN exprev = 'Expense' AND type = 'utility' THEN Currency END) AS [utility expense currency], SUM(CASE WHEN exprev = 'Expense' AND type = 'utility' THEN usd_amount ELSE 0 END) AS [utility expense (USD)] FROM transactions GROUP BY date, id ORDER BY date, id;
关键点
- 用
SUM()做条件聚合,把exprev和type的组合作为判断条件,直接生成对应汇总列 - 用
MAX()提取货币值:同一date+id下的同类型支出货币通常一致,MAX()会自动忽略非目标行的NULL值,拿到唯一有效的货币类型 - GROUP BY仅保留行维度的
date和id,避免多余分组导致的多行问题
为啥PIVOT搞不定?
PIVOT只能基于单一列的不同值转列,无法直接处理exprev+type这种多列组合的场景,条件聚合在这类灵活的组合需求上比PIVOT更实用。
内容的提问来源于stack exchange,提问作者solarissf
相关产品推荐
相关产品推荐

