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

Fjern dubletter fra Count()-resultater i SQLite

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()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.


  1. Konverter MySQL til SQLite

  2. Den midlertidige SQL Server-tabel forsvinder

  3. Sådan fungerer RIGHT()-funktionen i MySQL

  4. Hvordan ændres PostgreSQL brugeradgangskode?