MySQL: Renvoi de zéro quand aucune valeur n'est présente, catégorisé mensuel
-
20-09-2019 - |
Question
J'ai les deux tableaux suivants qui enregistrent les dépenses et fournissent des informations sur la catégorie des dépenses:
Transactions de table:
+-------+--------+--------+
| month | cat_id | amount |
+-------+--------+--------+
| 1 | 2 | 3 |
| 1 | 2 | 8 |
| 2 | 1 | 7 |
| 2 | 1 | 5 |
+-------+--------+--------+
Catégories de table:
+--------+-------------+
| cat_id | cat_desc |
+--------+-------------+
| 1 | Stock |
| 2 | Consumables |
+--------+-------------+
Ce que je voudrais, c'est construire une requête qui affiche une somme des montants pour chaque catégorie, pour chaque mois, même s'il n'y a pas de dépenses dans cette catégorie pour ce mois comme celle-ci:
+-------+-------------+--------+
| month | cat_desc | amount |
+-------+-------------+--------+
| 1 | Stock | 0 |
| 1 | Consumables | 11 |
| 2 | Stock | 12 |
| 2 | Consumables | 0 |
+-------+-------------+--------+
Je soupçonne qu'une jointure extérieure devrait être utilisée, mais je n'ai pas encore trouvé de déclaration pour le faire.
Merci pour toute aide.
La solution
Celui-ci devrait vous fournir le résultat correct. Le Select intérieur prépare une liste de tous les mois combinés à toutes les catégories, et le LEFT JOIN
gère le reste.
SELECT t.month, t.cat_desc, COALESCE(SUM(t2.amount), 0) amount
FROM (
SELECT DISTINCT t.month, c.cat_id, c.cat_desc
FROM categories c
CROSS JOIN transactions t
) t
LEFT JOIN transactions t2 ON ( t2.month = t.month AND t2.cat_id = t.cat_id )
GROUP BY t.month, t.cat_desc
Les performances peuvent être meilleures avec les éléments suivants (en utilisant DISTINCT
uniquement si nécessaire), mais vous devrez essayer:
SELECT t.month, t.cat_desc, COALESCE(SUM(t2.amount), 0) amount FROM (
SELECT t.month, c.cat_id, c.cat_desc
FROM
(SELECT DISTINCT month FROM transactions) t
CROSS JOIN categories c
) t
LEFT JOIN transactions t2 ON ( t2.month = t.month AND t2.cat_id = t.cat_id )
GROUP BY t.month, t.cat_desc
Autres conseils
SELECT c.cat_id, c.cat_desc,t.month, SUM(t.amount)
FROM categories c
LEFT JOIN transactions t ON (t.cat_id = c.cat_id)
GROUP BY c.cat_id,t.month
SELECT c.cat_id, c.cat_desc,t.month, SUM(t.amount)
FROM categories c
LEFT JOIN transactions t ON (t.cat_id = c.cat_id)
GROUP BY t.month,c.cat_id
Order By t.month