MySQL如何查询所有预定义支付方式的交易总额(含无交易项)
解决预定义支付方式的聚合查询问题
这个问题我之前也碰到过,核心问题出在分组的字段选错了,调整一下分组依据和NULL值处理就能完美得到你想要的结果。
正确的SQL查询语句
SELECT LOWER(m.name) AS mode, COALESCE(SUM(p.amount), 0) AS total FROM ( VALUES ('Cash'), ('Card'), ('Cheque'), ('Bank') ) AS m(name) LEFT JOIN payments p ON m.name = p.mode GROUP BY m.name ORDER BY mode;
为什么你的原查询不对?
你之前的语句用了GROUP BY p.mode,但当某个预定义支付方式在payments表里没有任何交易记录时,p.mode会返回NULL——所有无记录的方式都会被合并成一行NULL,而不是单独显示每个预定义的mode名称。
关键调整点
- 用预定义的支付方式分组:改用
GROUP BY m.name,这样每个预定义的支付方式都会作为独立的分组存在,不管有没有对应的交易记录。 - 处理NULL值:用
COALESCE(SUM(p.amount), 0)把无交易时返回的NULL转换成0,完全匹配你想要的结果格式。 - 统一大小写(可选):如果需要结果里的mode是小写(比如你示例里的
cash、cheque),用LOWER(m.name)转换即可;如果要保留原大小写,直接用m.name AS mode就行。
执行这个查询后,就能得到你期望的结果:
| mode | total |
|---|---|
| cash | 100 |
| cheque | 0 |
| bank | 0 |
| card | 300 |
内容的提问来源于stack exchange,提问作者Jaime Sangcap
相关产品推荐
相关产品推荐

