sql >> Databasteknik >  >> RDS >> SQLite

Ta bort dubbletter från Count()-resultat i SQLite

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


  1. Oracle SQL returnerar rader på godtyckligt sätt när ingen order by-sats används

  2. Få närmaste longitud och latitud från MSSQL-databastabellen?

  3. Väljer du alla kolumner som börjar med XXX med hjälp av ett jokertecken?

  4. T-SQL Hoppa över Ta lagrad procedur