MYSQL:将值列表加入表中

时间:2018-01-23 11:31:24

标签: mysql sql

我有预定义值列表CashBankCardCheque名为payment 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   +
++++++++++++++++++++

1 个答案:

答案 0 :(得分:2)

在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)
  • 您可能需要考虑包含模式值的参考表。