SQL para encontrar o número de valores distintos em uma coluna

340

Posso selecionar todos os valores distintos em uma coluna das seguintes maneiras:

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

Mas como obtenho a contagem de linhas dessa consulta? É necessária uma subconsulta?

Christian Oudard
fonte
11
Qual versão do SQL Server você está usando?
245 Kevin Fairchild

Respostas:

613

Você pode usar a DISTINCTpalavra - chave na COUNTfunção agregada:

SELECT COUNT(DISTINCT column_name) AS some_alias FROM table_name

Isso contará apenas os valores distintos para essa coluna.

Noah Goodrich
fonte
7
Legal, eu não sabia que você poderia colocar a palavra-chave distinta lá.
Christian Oudard 26/09/08
13
também funciona em gruposselect A,COUNT(DISTINCT B) from table group by A
tmanthey
6
você pode expandir este exemplo para distinguir em várias colunas?
Eugene
11 anos depois, e isso ainda é útil
wundermahn
175

Isso fornecerá AMBOS os valores distintos da coluna e a contagem de cada valor. Normalmente, acho que quero conhecer as duas informações.

SELECT [columnName], count([columnName]) AS CountOf
FROM [tableName]
GROUP BY [columnName]
Paul James
fonte
60
Como você está agrupando columnName, você já está recebendo os valores distintos apenas uma vez e a distinctpalavra - chave não faz nada aqui. Experimente a consulta sem ela, o conjunto de resultados é exatamente o mesmo.
Antti29
26

Esteja ciente de que Count () ignora valores nulos; portanto, se você precisar permitir nulo como seu próprio valor distinto, poderá fazer 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
fonte
Eu realmente acho que a sua declaração caso foi quis dizer:case when my_col is null then 1 else my_col end
James Jensen
Para maior clareza: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
contagem (*) inclui valores nulos
PragmaticProgrammer
11
@PragmaticProgrammer Acho que sim, mas não existe uma linha nula, apenas um valor nulo, e count(*)é especificamente uma contagem de linhas.
David Aldridge
20

Uma soma sql dos valores exclusivos de column_name e classificados pela frequência:

SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name ORDER BY 2 DESC;
xchiltonx
fonte
11
Definitivamente a melhor resposta para IMO
Briford Wylie 29/08/19
13
select count(*) from 
(
SELECT distinct column1,column2,column3,column4 FROM abcd
) T

Isso dará a contagem de grupos distintos de colunas.

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

você precisa contar essa coluna distinta e atribuir um apelido.

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

**

Usando o SQL a seguir, podemos obter a contagem distinta do valor da coluna no Oracle 11g.

**

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

Você pode usar esta consulta para contar dados diferentes / distintos. obrigado

Nitika Chopra
fonte
0

Após o MS SQL Server 2012, você também pode usar a função de janela.

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

A contagem (distinta ({nome do campo})) é redundante

Basta Contar ({nome do campo}) fornece todos os valores distintos nessa tabela. Isso (como muitos presumem) não fornece apenas o número da tabela [ie NÃO é o mesmo que o número (*) da tabela]

Paul Pena
fonte
2
Não, isso não está correto. count(field)retorna o número de linhas onde fieldestá not null.
Antti29