我有一个名为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 +
++++++++++++++++++++
最佳答案
在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)
。您可能需要考虑包含模式值的引用表。