SQL pour trouver le nombre de valeurs distinctes dans une colonne

342

Je peux sélectionner toutes les valeurs distinctes dans une colonne des manières suivantes:

  • SELECT DISTINCT column_name FROM table_name;
  • SELECT column_name FROM table_name GROUP BY column_name;

Mais comment puis-je obtenir le nombre de lignes de cette requête? Une sous-requête est-elle requise?

Christian Oudard
la source
1
Quelle version de SQL Server utilisez-vous?
Kevin Fairchild

Réponses:

614

Vous pouvez utiliser le DISTINCTmot clé dans la COUNTfonction d'agrégation:

SELECT COUNT(DISTINCT column_name) AS some_alias FROM table_name

Cela ne comptera que les valeurs distinctes pour cette colonne.

Noah Goodrich
la source
7
Bien, je ne savais pas que vous pouviez y mettre le mot-clé distinct.
Christian Oudard
13
travaille également sur des groupesselect A,COUNT(DISTINCT B) from table group by A
tmanthey
6
pouvez-vous développer cet exemple pour le distinguer sur plusieurs colonnes?
eugene
11 ans plus tard, et cela est toujours utile
wundermahn
176

Cela vous donnera les deux valeurs de colonne distinctes et le nombre de chaque valeur. Je trouve généralement que je veux connaître les deux informations.

SELECT [columnName], count([columnName]) AS CountOf
FROM [tableName]
GROUP BY [columnName]
Paul James
la source
60
Puisque vous effectuez un regroupement columnName, vous obtenez déjà les valeurs distinctes une seule fois et le distinctmot clé ne fait rien ici. Essayez la requête sans elle, le jeu de résultats est exactement le même.
Antti29
26

Sachez que Count () ignore les valeurs nulles, donc si vous devez autoriser null comme sa propre valeur distincte, vous pouvez faire quelque chose de délicat comme:

select count(distinct my_col)
       + count(distinct Case when my_col is null then 1 else null end)
from my_table
/
David Aldridge
la source
Je pense vraiment que votre déclaration de cas était censée dire:case when my_col is null then 1 else my_col end
James Jensen
Pour plus de clarté:SELECT my_col, COUNT(my_col) + COUNT(CASE WHEN my_col IS NULL THEN 1 ELSE NULL END) as CountOf from my_Table GROUP BY my_col
Michael Paulukonis
count (*) comprend les nulls
PragmaticProgrammer
1
@PragmaticProgrammer Je suppose que oui, mais il n'y a rien de tel qu'une ligne nulle, seulement une valeur nulle, et count(*)c'est spécifiquement un nombre de lignes.
David Aldridge
20

Une somme sql des valeurs uniques de nom_colonne et triée par la fréquence:

SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name ORDER BY 2 DESC;
xchiltonx
la source
1
Certainement la meilleure réponse OMI
Briford Wylie
13
select count(*) from 
(
SELECT distinct column1,column2,column3,column4 FROM abcd
) T

Cela donnera le nombre de groupes distincts de colonnes.

gipinani
la source
11
SELECT COUNT(DISTINCT column_name) FROM table as column_name_count;

vous devez compter ce col distinct, puis lui donner un alias.

Pete Karl II
la source
5
select Count(distinct columnName) as columnNameCount from tableName 
Wayne
la source
0

**

En utilisant le SQL suivant, nous pouvons obtenir le nombre de valeurs de colonne distinct dans Oracle 11g.

**

Select count(distinct(Column_Name)) from TableName
Nilesh Shinde
la source
0
select count(distinct(column_name)) AS columndatacount from table_name where somecondition=true

Vous pouvez utiliser cette requête pour compter des données différentes / distinctes. Merci

Nitika Chopra
la source
0

Après MS SQL Server 2012, vous pouvez également utiliser la fonction de fenêtre.

   SELECT column_name, 
   COUNT(column_name) OVER (Partition by column_name) 
   FROM table_name group by column_name ; 
Alper
la source
-8

Le compte (distinct ({fieldname})) est redondant

Simply Count ({fieldname}) vous donne toutes les valeurs distinctes de cette table. Il ne vous donnera pas (comme beaucoup le supposent) le compte de la table [c.-à-d. PAS le même que le compte (*) de la table]

Paul Pena
la source
2
Non, ce n'est pas correct. count(field)renvoie le nombre de lignes où fieldest not null.
Antti29