Maison >base de données >tutoriel mysql >Comment puis-je compter efficacement les occurrences de données dans SQL avec plusieurs conditions ?

Comment puis-je compter efficacement les occurrences de données dans SQL avec plusieurs conditions ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-24 06:27:11791parcourir

How Can I Efficiently Count Data Occurrences in SQL with Multiple Conditions?

Méthode de comptage de conditions SQL efficace

En SQL, il existe de nombreuses façons de regrouper et de compter les occurrences de données selon une colonne spécifique. Dans PostgreSQL, le moyen le plus simple consiste à utiliser une expression CASE, comme indiqué dans l'exemple de requête. Cependant, cette approche peut devenir lourde lorsqu’il s’agit d’un grand nombre de valeurs possibles.

PostgreSQL 9.4 et versions ultérieures fournissent une méthode plus optimisée et flexible : l'FILTERoption d'agrégation. La clause FILTER vous permet d'appliquer des conditions supplémentaires à une fonction d'agrégation, en comptant uniquement les valeurs spécifiques qui correspondent à une condition spécifique.

<code class="language-sql">SELECT category
     , count(*) FILTER (WHERE question1 = 0) AS zero
     , count(*) FILTER (WHERE question1 = 1) AS one
     , count(*) FILTER (WHERE question1 = 2) AS two
FROM   reviews
GROUP  BY 1;</code>

Cette requête compte effectivement les occurrences de zéro, un et deux dans la colonne question1, regroupées par la colonne catégorie.

Pour une optimisation plus poussée, la version courte suivante peut être utilisée :

<code class="language-sql">SELECT category
     , count(question1 = 0 OR NULL) AS zero
     , count(question1 = 1 OR NULL) AS one
     , count(question1 = 2 OR NULL) AS two
FROM   reviews
GROUP  BY 1;</code>

Pour les scénarios complexes impliquant plusieurs conditions ou un grand nombre d'options, la fonction crosstab() offre d'excellentes performances et simplicité :

<code class="language-sql">SELECT * FROM crosstab(
     'SELECT category, question1, count(*) AS ct
      FROM   reviews
      GROUP  BY 1, 2
      ORDER  BY 1, 2'
   , 'VALUES (0), (1), (2)'
   ) AS ct (category text, zero int, one int, two int);</code>

Cette crosstab requête produit un ensemble de résultats contenant tous les décomptes requis, présentés sous forme de colonnes nommées pour un accès et une analyse faciles.

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