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>