MYSQL : Joindre une liste de valeurs dans une table
J'ai une liste de valeurs prédéfinies Cash
, Bank
, Card
, Cheque
appelées payment modes
(pas de table db pour elles).
Chacun payments
aura son mode.
+-----------+
+ Payments +
+-----------+
+ id +
+ amount +
+ date +
+ mode +
+-----------+
La requête ci-dessous n'affichera pas mode
ceux qui ne figurent pas dans le payments
tableau. 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 Constructor
mais 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 payments
table ? 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é
name
pourmode
que la colonne avec les mêmes informations ait le même nom. - The
group by
key needs to be from the first name, not the second (that ism.mode
instead ofp.mode
). - Si vous voulez
0
au 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