我有一个名为Cash的预定义值列表BankCardChequepayment modes(它们没有数据库表)。
每个payments都有它的模式。

+-----------+
+ Payments  +
+-----------+
+ id        +
+ amount    +
+ date      +
+ mode      +
+-----------+

下面的查询不会显示不在mode表中的payments。例如,如果未通过cheque付款,则结果中不会包含此项。
select p.mode, SUM(p.amount) 'total'
from payments p

我也发现了Table Value Constructor,但我不确定MySql是否支持它,因为我有语法错误。
select p.mode, SUM(p.amount)
from (
    VALUES
      ('Cash'),
      ('Card'),
      ('Cheque'),
      ('Bank')
 ) as m(name)
 left join payments p on m.name = p.mode
group by p.mode

有没有办法让查询获取所有模式,而不管它们是否不在payments表中?我需要这样一个结果:
++++++++++++++++++++
+ mode     | total +
++++++++++++++++++++
+ cash     | 100   +
+ cheque   | 0     +
+ bank     | 0     +
+ card     | 300   +
++++++++++++++++++++

最佳答案

在MySQL中,可以使用union all构造表:

select m.mode, SUM(p.amount)
from (select 'Cash' as mode union all
      select 'Card' union all
      select 'Cheque' union all
      select 'Bank'
     ) m left join
     payments p
     on m.mode = p.mode
group by m.mode;

笔记:
我将name更改为mode,因此具有相同信息的列具有相同的名称。
group by键需要来自第一个名称,而不是第二个名称(即m.mode而不是p.mode)。
如果您想要0而不是NULL,请使用coalesce(sum(p.amount), 0)
您可能需要考虑包含模式值的引用表。

07-28 02:59
查看更多