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?


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.


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]

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
/

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;

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.


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

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


5
select Count(distinct columnName) as columnNameCount from tableName 

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

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


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 ; 

-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]


2
Não, isso não está correto. count(field)retorna o número de linhas onde fieldestá not null.
Antti29
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.