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.