如何编写SQL查询按商户分组统计各支付方式交易总额
错误原因
当前SQL返回结果不符合预期,核心是两处写法错误:
GROUP BY子句多余加入了payment_mode字段,会把同一商户下不同支付方式的记录拆成独立分组,只要商户同时有两类支付交易,就会被拆成两行输出。- 聚合函数
SUM()和条件判断CASE WHEN的顺序写反,当前写法是先判断支付方式再对分组内金额求和,逻辑上无法跨同商户的不同支付方式分组聚合。
另外注意原表商户字段名为merchant,原SQL写的merchant_id和表结构不匹配;payment_mode的取值要和表内实际存储的大小写一致,避免匹配失败。
修正后SQL
SELECT merchant, SUM(CASE WHEN payment_mode = 'CASH' THEN amount ELSE 0 END) AS cash_amount, SUM(CASE WHEN payment_mode = 'ONLINE' THEN amount ELSE 0 END) AS online_amount FROM details WHERE payment_mode IN ('CASH', 'ONLINE') GROUP BY merchant;
逻辑说明
- 仅按
merchant字段分组,保证每个商户最终仅返回一行结果。 - 将
SUM()放在CASE WHEN外层,遍历当前商户分组下的所有交易记录:匹配对应支付方式的记录累加交易金额,不匹配的记录累加0,没有对应支付方式交易时最终求和结果自然为0,完全符合需求。
如果表内payment_mode实际存储为小写cash/online,将语句中对应的大写枚举值替换为小写即可。
内容的提问来源于stack exchange,提问作者Vansh Bhagat
相关产品推荐
相关产品推荐

