You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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就行。

执行这个查询后,就能得到你期望的结果:

modetotal
cash100
cheque0
bank0
card300

内容的提问来源于stack exchange,提问作者Jaime Sangcap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:03:44