我有预定义值列表Cash
,Bank
,Card
,Cheque
名为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 +
++++++++++++++++++++
答案 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)
。