SQL para encontrar el número de valores distintos en una columna

340

Puedo seleccionar todos los valores distintos en una columna de las siguientes maneras:

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

Pero, ¿cómo obtengo el recuento de filas de esa consulta? ¿Se requiere una subconsulta?

Christian Oudard
fuente
1
¿Qué versión de SQL Server estás usando?
Kevin Fairchild

Respuestas:

613

Puede usar la DISTINCTpalabra clave dentro de la COUNTfunción agregada:

SELECT COUNT(DISTINCT column_name) AS some_alias FROM table_name

Esto contará solo los valores distintos para esa columna.

Noah Goodrich
fuente
77
Genial, no sabía que podía poner la palabra clave distinta allí.
Christian Oudard
13
también funciona en gruposselect A,COUNT(DISTINCT B) from table group by A
tmanthey
66
¿puedes expandir este ejemplo a distinto en varias columnas?
eugene
11 años después, y esto sigue siendo útil
wundermahn
175

Esto le dará AMBOS valores de columna distintos y el recuento de cada valor. Generalmente encuentro que quiero saber ambas piezas de información.

SELECT [columnName], count([columnName]) AS CountOf
FROM [tableName]
GROUP BY [columnName]
Paul James
fuente
6060
Dado que está agrupando por columnName, ya está obteniendo los valores distintos solo una vez y la distinctpalabra clave no hace nada aquí. Pruebe la consulta sin ella, el conjunto de resultados es exactamente el mismo.
Antti29
26

Tenga en cuenta que Count () ignora los valores nulos, por lo que si necesita permitir null como su propio valor distintivo, puede hacer algo complicado como:

select count(distinct my_col)
       + count(distinct Case when my_col is null then 1 else null end)
from my_table
/
David Aldridge
fuente
Realmente creo que su declaración de caso debía decir:case when my_col is null then 1 else my_col end
James Jensen
Para mayor claridad: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 (*) incluye nulos
PragmaticProgrammer
1
@PragmaticProgrammer Supongo que sí, pero no existe una fila nula, solo un valor nulo, y count(*)es específicamente un recuento de filas.
David Aldridge
20

Una suma de sql de los valores únicos de column_name y ordenados por la frecuencia:

SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name ORDER BY 2 DESC;
xchiltonx
fuente
1
Definitivamente la mejor respuesta OMI
Briford Wylie
13
select count(*) from 
(
SELECT distinct column1,column2,column3,column4 FROM abcd
) T

Esto dará cuenta del grupo distinto de columnas.

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

tienes que contar esa columna distinta, luego darle un alias.

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

** **

Usando el siguiente SQL podemos obtener el recuento de valores de columna distintos en Oracle 11g.

** **

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

Puede usar esta consulta para contar datos diferentes / distintos. Gracias

Nitika Chopra
fuente
0

Después de MS SQL Server 2012, también puede usar la función de ventana.

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

El recuento (distinto ({fieldname})) es redundante

Simplemente contar ({fieldname}) le ofrece todos los valores distintos en esa tabla. No (como muchos suponen) solo le dará el Conteo de la tabla [es decir, NO es lo mismo que el Conteo (*) de la tabla]

Paul Pena
fuente
2
No, esto no es correcto. count(field)devuelve el número de líneas donde fieldestá not null.
Antti29