Maison >base de données >tutoriel mysql >Comment récupérer efficacement plusieurs agrégations de sommes avec le filtrage conditionnel dans MySQL ?

Comment récupérer efficacement plusieurs agrégations de sommes avec le filtrage conditionnel dans MySQL ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-21 12:45:10854parcourir

How to Efficiently Retrieve Multiple Sum Aggregations with Conditional Filtering in MySQL?

MySQL : Récupérer efficacement plusieurs agrégations de sommes avec le filtrage conditionnel

Travailler avec des bases de données nécessite souvent de récupérer plusieurs ensembles de données en fonction de conditions variables. Cela peut être particulièrement complexe lorsqu'il s'agit de différentes valeurs de champ au sein d'une même requête.

Le défi :

Considérons un tableau transactions avec les colonnes id, account_id, budget_id, points et type. Le but est de récupérer, en une seule requête, la somme de points pour chaque budget_idtype est égal à « allocation », et séparément, la somme de pointstype est égal à « problème ».

La solution : tirer parti de la IF() fonction de MySQL

La fonction IF() de MySQL fournit une solution concise. Nous pouvons l'utiliser au sein d'un SUM() agrégat, combiné avec GROUP BY, pour obtenir le résultat souhaité :

<code class="language-sql">SELECT 
    budget_id, 
    SUM(IF(type = 'allocation', points, 0)) AS allocated,
    SUM(IF(type = 'issue', points, 0)) AS issued
FROM 
    transactions
GROUP BY 
    budget_id;</code>

Répartition des requêtes :

  • IF(type = 'allocation', points, 0) : Cette expression conditionnelle vérifie chaque ligne. Si type est « allocation », il renvoie la valeur points ; sinon, il renvoie 0.
  • IF(type = 'issue', points, 0) : Cela reflète ce qui précède, mais pour type = 'problème'.
  • SUM(...) : La fonction SUM() calcule le total pour chaque expression conditionnelle, additionnant efficacement les points séparément pour les types « allocation » et « problème ».
  • GROUP BY budget_id : Cela regroupe les résultats par budget_id, fournissant les sommes agrégées pour chaque budget.

Exemple illustratif :

La requête, lorsqu'elle est exécutée sur la table transactions, peut produire un ensemble de résultats comme celui-ci :

<code>budget_id | allocated | issued
----------|-----------|--------
     434  |   200000  |   100
     242  |   100000  |  5020
     621  |    45000  |  3940</code>

Cela démontre la récupération efficace de plusieurs ensembles de données agrégées avec un filtrage conditionnel distinct au sein d'une seule requête MySQL optimisée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn