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é namepour modeque 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 is m.mode instead of p.mode).

  • Si vous voulez 0au lieu de NULL, utilisez coalesce(sum(p.amount), 0).

  • Vous pouvez envisager une table de référence contenant les valeurs de mode.

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"