Maison >base de données >tutoriel mysql >Comment MySQL peut-il réaliser efficacement des agrégations conditionnelles sans prise en charge directe de « SUM IF » et « COUNT IF » ?

Comment MySQL peut-il réaliser efficacement des agrégations conditionnelles sans prise en charge directe de « SUM IF » et « COUNT IF » ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-15 00:58:02740parcourir

How can MySQL effectively achieve conditional aggregations without direct support for 'SUM IF' and 'COUNT IF'?

Solution élégante : surmonter les limitations de « SUM IF » et « COUNT IF » dans MySQL

Malgré leur utilité, MySQL manque de support direct pour les fonctions 'SUM IF' et 'COUNT IF'. Cette limitation peut souvent s’avérer frustrante lorsqu’il s’agit d’agrégations conditionnelles. Cependant, il existe une solution élégante utilisant les instructions CASE.

Considérons le scénario suivant :

| id | hour | kind |
|---|---|---|
| 1 | 10 | 1 |
| 2 | 15 | 2 |
| 3 | 20 | 1 |
| 4 | 25 | 3 |

L'objectif est de calculer :

  • Le nombre total d'enregistrements
  • Le nombre total d'heures
  • Le nombre d'enregistrements où « genre » est égal à 1

Tentatives originales et réponse de MySQL :

Les tentatives initiales utilisant 'SUM( IF(...) )' ou 'COUNT( IF(. ..) )' entraîne une erreur. MySQL ne permet pas de mélanger des fonctions d'agrégation avec des structures de contrôle telles que « IF ».

Solution utilisant l'instruction CASE :

L'instruction CASE fournit une expression conditionnelle pour évaluer et renvoyer dynamiquement valeurs. Il peut être utilisé pour réaliser efficacement les agrégations conditionnelles souhaitées. Voici comment :

SELECT count(id), 
    SUM(hour) as totHour, 
    SUM(case when kind = 1 then 1 else 0 end) as countKindOne

Cette requête effectue les opérations suivantes :

  • count(id) : compte le nombre total d'enregistrements.
  • SUM(hour) : Calcule le nombre total d'heures.
  • SUM(case when kind = 1 then 1 else 0 end) : utilise une instruction CASE pour compter conditionnellement le nombre d'enregistrements où « genre » est égal à 1.

Sortie :

| count(id) | totHour | countKindOne |
|---|---|---|
| 4 | 70 | 2 |

En utilisant l'instruction CASE, nous pouvons élégamment surmontez les limitations de « SUM IF » et « COUNT IF » dans MySQL, permettant des agrégations conditionnelles efficaces.

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