MYSQL : Joindre une liste de valeurs dans une table
J'ai une liste de valeurs prédéfinies Cash, Bank, Card, Chequeappelées payment modes (pas de table db pour elles).
Chacun paymentsaura son mode.
+-----------+
+ Payments +
+-----------+
+ id +
+ amount +
+ date +
+ mode +
+-----------+
La requête ci-dessous n'affichera pas modeceux qui ne figurent pas dans le paymentstableau. Si par exemple aucun paiement n'est effectué via cheque, alors ce ne sera pas dans le résultat.
select p.mode, SUM(p.amount) 'total'
from payments p
J'ai également découvert Table Value Constructormais je ne sais pas si c'est pris en charge dans MySql car j'ai une erreur de syntaxe.
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
Existe-t-il un moyen d'avoir une requête qui obtient tous les modes, qu'ils ne soient pas présents ou non dans la paymentstable ? J'ai besoin d'un résultat du type:
++++++++++++++++++++
+ mode | total +
++++++++++++++++++++
+ cash | 100 +
+ cheque | 0 +
+ bank | 0 +
+ card | 300 +
++++++++++++++++++++
Solution of the problem
Dans MySQL, vous pouvez construire la table en utilisant 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;
Remarques:
- J'ai changé
namepourmodeque la colonne avec les mêmes informations ait le même nom. - The
group bykey needs to be from the first name, not the second (that ism.modeinstead ofp.mode). - Si vous voulez
0au lieu deNULL, utilisezcoalesce(sum(p.amount), 0). - Vous pouvez envisager une table de référence contenant les valeurs de mode.
Commentaires
Enregistrer un commentaire