Oracle SQL中如何用SUM()按用户分组汇总不同交易类型金额
Oracle SQL:按用户拆分不同交易类型求和的正确实现
原SQL的问题分析
你的尝试SQL存在几个关键问题:
- 语法错误:
"USER未闭合双引号,且列之间缺少逗号分隔 - 条件错误:WHERE子句误写为
trans_value = 1,实际应该针对trans_type_id筛选,但使用WHERE会直接过滤掉其他类型的数据,无法得到多列求和结果 - 未实现需求:仅对单一值求和,没有按交易类型拆分统计
正确SQL实现
要得到你需要的按用户、分交易类型的求和结果,需要使用CASE WHEN配合SUM()函数实现行转列:
SELECT user_id AS "USER", SUM(CASE WHEN trans_type_id = 1 THEN trans_value END) AS "SUM(TRANS_TYPE_1)", SUM(CASE WHEN trans_type_id = 2 THEN trans_value END) AS "SUM(TRANS_TYPE_2)" FROM TRANSACTION GROUP BY user_id ORDER BY user_id;
逻辑说明
CASE WHEN会判断每条记录的交易类型:当trans_type_id匹配目标类型时返回对应trans_value,否则返回NULLSUM()函数会自动忽略NULL值,只对符合条件的交易金额求和- 按
user_id分组后,每个用户的不同交易类型求和结果会汇总到同一行 - 不添加WHERE子句,确保所有用户和交易类型的数据都被统计,避免丢失无对应交易类型的用户数据(比如用户3的TRANS_TYPE_2列显示NULL)
验证结果
执行上述SQL后,会得到完全符合你需求的结果:
| USER | SUM(TRANS_TYPE_1) | SUM(TRANS_TYPE_2) |
|---|---|---|
| 1 | 15 | 25 |
| 2 | 5 | 20 |
| 3 | 35 | NULL |
内容的提问来源于stack exchange,提问作者Nicolás Ortega Muñoz
相关产品推荐
相关产品推荐

