SQL per trovare il numero di valori distinti in una colonna


342

Posso selezionare tutti i valori distinti in una colonna nei seguenti modi:

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

Ma come posso ottenere il conteggio delle righe da quella query? È richiesta una sottoquery?


1
Quale versione di SQL Server stai usando?
Kevin Fairchild,

Risposte:


614

È possibile utilizzare la DISTINCTparola chiave all'interno della COUNTfunzione aggregata:

SELECT COUNT(DISTINCT column_name) AS some_alias FROM table_name

Questo conterà solo i valori distinti per quella colonna.


7
Bene, non sapevo che potresti inserire la parola chiave distinta lì.
Christian Oudard,

13
lavora anche su gruppiselect A,COUNT(DISTINCT B) from table group by A
tmanthey,

6
puoi espandere questo esempio per distinguerlo su più colonne?
Eugene,

11 anni dopo, e questo è ancora utile
wundermahn, il

176

Questo ti darà ENTRAMBI i valori di colonna distinti e il conteggio di ciascun valore. Di solito scopro di voler conoscere entrambe le informazioni.

SELECT [columnName], count([columnName]) AS CountOf
FROM [tableName]
GROUP BY [columnName]

60
Dal momento che stai raggruppando columnName, stai già ottenendo i valori distinti solo una volta e la distinctparola chiave non fa nulla qui. Prova la query senza di essa, il set di risultati è esattamente lo stesso.
Antti29,

26

Tieni presente che Count () ignora i valori null, quindi se devi consentire null come valore distinto puoi fare qualcosa di complicato come:

select count(distinct my_col)
       + count(distinct Case when my_col is null then 1 else null end)
from my_table
/

Penso davvero che la tua dichiarazione sul caso avrebbe dovuto dire:case when my_col is null then 1 else my_col end
James Jensen l'

Per chiarezza: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 (*) include nulls
PragmaticProgrammer

1
@PragmaticProgrammer Immagino di sì, ma non esiste una riga nulla, ma solo un valore null ed count(*)è specificamente un conteggio di righe.
David Aldridge,

20

Una somma sql dei valori univoci di nome_colonna e ordinati per frequenza:

SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name ORDER BY 2 DESC;

1
Sicuramente la migliore risposta IMO
Briford Wylie il

13
select count(*) from 
(
SELECT distinct column1,column2,column3,column4 FROM abcd
) T

Questo darà il conto di un gruppo distinto di colonne.


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

devi contare quel col distinto, quindi dargli un alias.


5
select Count(distinct columnName) as columnNameCount from tableName 

0

**

Usando il seguente SQL possiamo ottenere il conteggio dei valori di colonna distinti in Oracle 11g.

**

Select count(distinct(Column_Name)) from TableName

0
select count(distinct(column_name)) AS columndatacount from table_name where somecondition=true

È possibile utilizzare questa query per contare dati diversi / distinti. Grazie


0

Dopo MS SQL Server 2012, è possibile utilizzare anche la funzione finestra.

   SELECT column_name, 
   COUNT(column_name) OVER (Partition by column_name) 
   FROM table_name group by column_name ; 

-8

Il conteggio (distinto ({fieldname})) è ridondante

Semplicemente Count ({fieldname}) ti dà tutti i valori distinti in quella tabella. Non (come molti presumono) ti darà solo il Conteggio della tabella [ovvero NON uguale al Conteggio (*) dalla tabella]


2
No, questo non è corretto. count(field)restituisce il numero di linee in cui fieldè not null.
Antti29,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.