SQLite
 sql >> Database >  >> RDS >> SQLite

Rimuovi duplicati dai risultati di Count() in SQLite

Quando si utilizza count() funzione in SQLite, potresti trovarti nella situazione in cui vuoi contare solo valori distinti. Cioè, non vuoi che i valori duplicati vengano contati più volte.

In altre parole, se la colonna ha lo stesso valore più volte, dovrebbe contare quel valore solo una volta.

Per impostazione predefinita, count() includerà tutti i valori duplicati nel suo calcolo. Ad esempio, se il valore "Cat" appare 3 volte, count() lo conterà come 3.

Tuttavia, se vuoi che vengano contati solo valori distinti, allora count() lo conterebbe come 1.

Fortunatamente, c'è un modo semplice per farlo. Tutto quello che devi fare è aggiungere il DISTINCT parola chiave al tuo count() funzione. In questo modo:

count(DISTINCT x)

Dove x è il nome della colonna per cui stai contando i contenuti (o l'intera riga se stai utilizzando il carattere jolly asterisco).

Esempio

Prendi la seguente tabella:

ProductId   ProductName    Price     
----------  -------------  ----------
1           Widget Holder  139.5     
2           Blue Widget    10.0      
3           Red Widget     10.0      
4           Green Widget   10.0      
5           Widget Stick   89.75     
6           Foo Cap        11.99     

Si noti che le righe da 2 a 4 hanno tutte lo stesso prezzo (10,0).

Se faccio un normale count() sul Prezzo colonna, conterà tutte e sei le righe.

SELECT count(Price) FROM Products;

Risultato:

6

Tuttavia, se aggiungo il DISTINCT parola chiave, conterà queste tre righe come una.

SELECT count(DISTINCT Price) FROM Products;

Risultato:

4

Conta righe distinte

Il count() la funzione accetta il carattere jolly asterisco (* ), il che significa che conterà tutte le righe.

Tuttavia, probabilmente riceverai un errore se provi a utilizzare DISTINCT quando si utilizza il carattere jolly asterisco.

Ecco una tabella con righe duplicate.

Postal      State             
----------  ------------------
NSW         New South Wales   
NSW         New South Wales   
QLD         Queensland        
TAS         Tasmania          
SA          South Australia   
WA          Western Australia 
VIC         Victoria          

In teoria, dovrei essere in grado di usare DISTINCT per contare le righe "deduplicate" in questa tabella. Tuttavia, ciò non sembra possibile.

SELECT count(DISTINCT *)
FROM States;

Risultato:

Error: near "*": syntax error

Invece, devo specificare un nome di colonna quando utilizzo DISTINCT parola chiave.

SELECT 
  count(State),
  count(DISTINCT State)
FROM States;

Risultato:

count(State)  count(DISTINCT State)
------------  ---------------------
7             6                    

Un altro modo per farlo sarebbe fare qualcosa del genere:

SELECT count(*) FROM (SELECT DISTINCT * FROM States);

Risultato:

6

Tuttavia, questo non dovrebbe essere un problema, poiché generalmente non è una buona progettazione del database consentire righe duplicate come questa.