Når du bruger count()
funktion i SQLite, kan du finde dig selv i den situation, hvor du kun ønsker at tælle forskellige værdier. Det vil sige, at du ikke ønsker, at duplikerede værdier skal tælles flere gange.
Med andre ord, hvis kolonnen har den samme værdi flere gange, bør den kun tælle denne værdi én gang.
Som standard er count()
vil inkludere alle duplikerede værdier i sin beregning. For eksempel, hvis værdien "Cat" vises 3 gange, count()
vil tælle det som 3.
Men hvis du kun ønsker, at distinkte værdier skal tælles, så count()
ville tælle det som 1.
Heldigvis er der en nem måde at gøre dette på. Alt du skal gøre er at tilføje DISTINCT
søgeord til din count()
fungere. Sådan:
count(DISTINCT x)
Hvor x
er kolonnenavnet, som indholdet du tæller for (eller hele rækken, hvis du bruger jokertegnet for stjerne).
Eksempel
Tag følgende tabel:
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
Bemærk, at række 2 til 4 alle har samme pris (10,0).
Hvis jeg laver en normal count()
på Pris kolonne, vil den tælle alle seks rækker.
SELECT count(Price) FROM Products;
Resultat:
6
Men hvis jeg tilføjer DISTINCT
søgeord, vil det tælle disse tre rækker som én.
SELECT count(DISTINCT Price) FROM Products;
Resultat:
4
Tæl forskellige rækker
count()
Funktionen accepterer jokertegnet for stjerne (*
), hvilket betyder, at den tæller alle rækker.
Du vil dog sandsynligvis få en fejl, hvis du prøver at bruge DISTINCT
når du bruger jokertegnet for stjerne.
Her er en tabel med dublerede rækker.
Postal State ---------- ------------------ NSW New South Wales NSW New South Wales QLD Queensland TAS Tasmania SA South Australia WA Western Australia VIC Victoria
I teorien burde jeg kunne bruge DISTINCT
at tælle de "de-dupede" rækker i denne tabel. Det ser dog ikke ud til at være muligt.
SELECT count(DISTINCT *)
FROM States;
Resultat:
Error: near "*": syntax error
I stedet skal jeg angive et kolonnenavn, når jeg bruger DISTINCT
søgeord.
SELECT
count(State),
count(DISTINCT State)
FROM States;
Resultat:
count(State) count(DISTINCT State) ------------ --------------------- 7 6
En anden måde at gøre det på ville være at gøre noget som dette:
SELECT count(*) FROM (SELECT DISTINCT * FROM States);
Resultat:
6
Dette burde dog ikke være et problem, da det generelt ikke er godt databasedesign at tillade duplikerede rækker som denne.