En SQL, comment compter DISTINCT sur plusieurs colonnes?


Meilleure réponse

en SQL, la clause DISTINCT peut être utilisée *** avant *** la liste de sélection, pour éviter les lignes en double dans la sortie ou *** à lintérieur *** dune fonction dagrégation, telle que COUNT. Dans le second cas, en particulier pour COUNT, leffet est denvisager de ne répéter les valeurs quune seule fois. Une solution est quavec la concaténation proposée par Greg Kemnitz, mis à part une petite erreur et des adaptations en fonction des types de colonnes et des fonctions de chaînes dans les différents moteurs sql

SELECT COUNT (DISTINCT CONCAT (col1, …. , col3)) FROM table;

La solution simple

SELECT COUNT (DISTINCT col1, col2, col3) FROM table;

fonctionne avec MySQL, ne fonctionne pas fonctionne dans DB2 et je ne connais pas d’autres moteurs, mais ce n’est pas du SQL standard.

Une autre solution, plus compliquée, qui peut être plus efficace si l’opération est fréquente et correctement optimisée, nécessite la création de une vue

CREATE VIEW vw AS SELECT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; SELECT COUNT (*) FROM vw;

Answer

mysql> create table fake (foo tinyint (3) not null default 0, bar varchar (64) not null default «  ») ; Requête OK, 0 ligne affectée (0,07 sec)

mysql> insérer dans de fausses valeurs (1, « foo »), (1, « bar »), (2, « foo »), (2, « bar »), (3, « baz »), (3, « pour »); Requête OK, 6 lignes affectées (0,00 sec) Enregistrements: 6 Duplicates: 0 Avertissements: 0

mysql> sélectionnez foo, bar, count (*) du faux groupe par foo, bar; + —– + —– + ———- + | foo | bar | count (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | pour | 1 | + —– + —– + ———- + 6 lignes dans lensemble (0,00 sec)

mysql> insérer dans de fausses valeurs (1, « toto « ), (1, » bar « ), (2, » foo « ), (2, » bar « ), (3, » baz « ), (3, » for « ); Requête OK, 6 lignes affectées (0,00 sec) Enregistrements: 6 Duplicates: 0 Avertissements: 0

mysql> sélectionnez foo, bar, count (*) du faux groupe par foo, bar; + —– + —– + ———- + | foo | bar | count (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | pour | 2 | + —– + —– + ———- + 6 lignes dans lensemble (0,00 sec)

mysql>

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *