När du använder count()
funktion i SQLite kan du hamna i situationen där du bara vill räkna distinkta värden. Det vill säga att du inte vill att dubbletter av värden ska räknas flera gånger.
Med andra ord, om kolumnen har samma värde flera gånger bör den bara räkna det värdet en gång.
Som standard är count()
kommer att inkludera alla dubbletter av värden i sin beräkning. Till exempel, om värdet "Cat" visas 3 gånger, count()
kommer att räkna det som 3.
Men om du bara vill att distinkta värden ska räknas, count()
skulle räkna det som 1.
Lyckligtvis finns det ett enkelt sätt att göra detta. Allt du behöver göra är att lägga till DISTINCT
nyckelord till din count()
fungera. Så här:
count(DISTINCT x)
Där x
är kolumnnamnet för vilket innehåll du räknar (eller hela raden om du använder asteriskens jokertecken).
Exempel
Ta följande tabell:
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
Lägg märke till att alla rader 2 till 4 har samma pris (10,0).
Om jag gör en normal count()
på Pris kolumnen kommer den att räkna alla sex raderna.
SELECT count(Price) FROM Products;
Resultat:
6
Men om jag lägger till DISTINCT
nyckelord, kommer det att räkna de tre raderna som en.
SELECT count(DISTINCT Price) FROM Products;
Resultat:
4
Räkna distinkta rader
count()
funktionen accepterar asteriskens jokertecken (*
), vilket betyder att den kommer att räkna alla rader.
Du kommer dock förmodligen att få ett felmeddelande om du försöker använda DISTINCT
när du använder asteriskens jokertecken.
Här är en tabell med dubbletter av rader.
Postal State ---------- ------------------ NSW New South Wales NSW New South Wales QLD Queensland TAS Tasmania SA South Australia WA Western Australia VIC Victoria
I teorin borde jag kunna använda DISTINCT
för att räkna de "avduperade" raderna i den här tabellen. Det verkar dock inte möjligt.
SELECT count(DISTINCT *)
FROM States;
Resultat:
Error: near "*": syntax error
Istället måste jag ange ett kolumnnamn när jag använder DISTINCT
nyckelord.
SELECT
count(State),
count(DISTINCT State)
FROM States;
Resultat:
count(State) count(DISTINCT State) ------------ --------------------- 7 6
Ett annat sätt att göra det skulle vara att göra något så här:
SELECT count(*) FROM (SELECT DISTINCT * FROM States);
Resultat:
6
Detta borde dock inte vara något problem, eftersom det i allmänhet inte är bra databasdesign att tillåta dubbletter av sådana här rader.