I SQL Server er COUNT()
funktion returnerer antallet af elementer fundet i en gruppe. Du kan bruge den til at finde ud af, hvor mange rækker der er i en tabel eller et resultatsæt.
Syntaks
Syntaksen ser sådan ud:
-- Aggregationsfunktionssyntaks COUNT ({[[ALL | DISTINCT] udtryk] | *}) - Analytisk funktionssyntaks COUNT ([ALLE] { udtryk | *}) OVER ([])
ALL
anvender den aggregerede funktion på alle værdier. Dette er standardværdien.
DISTINCT
angiver, at funktionen returnerer antallet af unikke ikke-nullværdier.
expression
er et udtryk af enhver type, undtagen billede , ntekst , eller tekst . Samlede funktioner og underforespørgsler understøttes ikke i udtrykket.
*
angiver, at alle rækker skal tælles og returneres, inklusive duplikerede rækker og rækker, der indeholder nulværdier. COUNT(*)
tager ingen parametre og understøtter ikke brugen af DISTINCT
. Det kræver heller ikke et udtryk parameter (fordi den ikke bruger information om nogen bestemt kolonne).
OVER ( [ <partition_by_clause> ]
dividerer resultatsættet produceret af FROM
klausul i partitioner, som funktionen anvendes på. Hvis det ikke er angivet, behandler funktionen alle rækker i forespørgselsresultatsættet som en enkelt gruppe.
Eksempel 1 – Grundlæggende brug
Her er et grundlæggende eksempel, der viser, hvordan denne funktion fungerer:
VÆLG ANTAL(*) SOM 'Rækketælling'FRA kunstnere;
Resultat:
+--------------+| Rækketælling ||-------------|| 16 |+-------------+
I dette tilfælde er der 16 rækker i Kunstnere tabel.
Bare for at være sikker, her er de:
VÆLG *FRA kunstnere;
Resultat:
+------------+------------------------+-------- ------+-------------+| ArtistId | Kunstnernavn | Aktiv Fra | CountryId ||-------------+------------------------+-------- -----+-------------|| 1 | Iron Maiden | 25-12-1975 | NULL || 2 | AC/DC | 11-01-1973 | NULL || 3 | Allan Holdsworth | 01-01-1969 | NULL || 4 | Buddy Rich | 01-01-1919 | NULL || 5 | Devin Townsend | 1993-01-01 | NULL || 6 | Jim Reeves | 01-01-1948 | NULL || 7 | Tom Jones | 01-01-1963 | NULL || 8 | Maroon 5 | 1994-01-01 | NULL || 9 | Scriptet | 2001-01-01 | NULL || 10 | Tændt | 26-06-1988 | NULL || 11 | Black Sabbath | 01-01-1968 | NULL || 12 | Michael lærer at rocke | 15-03-1988 | NULL || 13 | Carabao | 1981-01-01 | NULL || 14 | Karnivool | 1997-01-01 | NULL || 15 | Fugle i Tokyo | 2004-01-01 | NULL || 16 | Bodyjar | 1990-01-01 | NULL |+------------+------------------------+-------- -----+--------------------+
Som forventet returneres 16 rækker.
Bemærk, at CountryId kolonne indeholder intet andet end null-værdier. Dette vil være nyttigt i det næste eksempel.
Eksempel 2 – Angiv en kolonne
Det forrige eksempel brugte en stjerne (*
) for at angive alle rækker. Dette resulterer i, at alle rækker tælles, uanset om der er dubletter, eller om nogen indeholder null-værdier.
Du kan også angive en bestemt kolonne. Når du gør dette, tælles null-værdier ikke. Det vil sige, at alle rækker, der indeholder en null-værdi for den pågældende kolonne, ikke tælles med.
Her er et eksempel, der bruger CountryId kolonne som nævnt i det foregående eksempel:
VÆLG COUNT(CountryId) SOM 'Row Count'FRA kunstnere;
Resultat:
+--------------+| Rækketælling ||-------------|| 0 |+-------------+
Som vi så i det foregående eksempel, er alle rækker for denne kolonne NULL
. Derfor er det resulterende rækkeantal nul.
Lad os tilføje nogle værdier i den kolonne:
OPDATERING ArtistsSET CountryId =2WHERE ArtistName IN ( 'AC/DC', 'Karnivool', 'Birds of Tokyo', 'Bodyjar' );
Lad os nu tælle rækkerne for den kolonne igen:
VÆLG COUNT(CountryId) SOM 'Row Count'FRA kunstnere;
Resultat:
+--------------+| Rækketælling ||-------------|| 4 |+-------------+
Eksempel 3 – Med DISTINCT
Dette eksempel bruger DISTINCT
klausul for kun at returnere distinkte rækker (dvs. ikke-duplikater).
I det forrige eksempel opdaterede jeg tabellen, så den samme
CountryId
blev anvendt på fire kunstnere (jeg brugte SET CountryId = 2
for alle fire kunstnere). Dette resulterede i fire rækker med det samme
CountryId
.
Her er, hvad der sker, hvis jeg tæller hvor mange forskellige CountryId s er i denne tabel:
SELECT COUNT(DISTINCT CountryId) 'Distinct CountryIds'FROM artists;
Resultat:
+------------------------------+| Distinkte lande-id'er ||-----------------------------|| 1 |+------------------------------+
Dette kan forventes, fordi selvom der er fire rækker med et CountryId , det er stadig kun et enkelt CountryId .
Bare for at være sikker, lad os køre den sammen med dens "ikke distinkte" version:
VÆLG COUNT(CountryId) 'Non Distinct', COUNT(DISTINCT CountryId) 'Distinct'FROM artists;
Resultat:
+----------------+------------+| Ikke distinkt | Særskilt ||----------------+------------|| 4 | 1 |+----------------+------------+
Så den ikke-distinkte version viser hvor mange gange
CountryId
vises i tabellen, hvorimod DISTINCT
version tæller flere forekomster som 1.
Lad os tilføje endnu et CountryId til bordet:
OPDATERING ArtistsSET CountryId =1WHERE ArtistName ='Carabao';
Og kør nu forespørgslen igen:
VÆLG COUNT(CountryId) 'Non Distinct', COUNT(DISTINCT CountryId) 'Distinct'FROM artists;
Resultat:
+----------------+------------+| Ikke distinkt | Særskilt ||----------------+------------|| 5 | 2 |+----------------+------------+
Eksempel 4 – Brug en WHERE-klausul
Her er et hurtigt eksempel med en WHERE
klausul.
VÆLG ANTAL(*) SOM 'Rækketælling'FRA ArtistsWHERE ActiveFrom>='2000-01-01';
Resultat:
+--------------+| Rækketælling ||-------------|| 2 |+-------------+
Eksempel 5 – Med GROUP BY
Her er et eksempel på at gruppere kunstnerne i én kolonne og derefter tælle alle albummer for hver kunstner i den anden kolonne.
Eksempel:
SELECT ArtistName, COUNT(al.AlbumId) 'Number of Albums'FROM Artists arINNER JOIN Albums ALON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameORDER BY 'Number of Albums' DESC;
Resultat:
+------------------------+--------------------+ | Kunstnernavn | Antal album ||------------------------+------------------------ || Iron Maiden | 5 || Michael lærer at rocke | 3 || Scriptet | 3 || Tom Jones | 3 || Devin Townsend | 3 || Allan Holdsworth | 2 || Buddy Rich | 1 || AC/DC | 1 || Jim Reeves | 1 |+------------------------+--------------------+
Eksempel 6 – Med HAVING-klausulen
Vi kan justere det foregående eksempel til kun at inkludere de kunstnere, der har mere end et vist antal album. Vi kan gøre dette ved at bruge HAVING
klausul.
SELECT ArtistName, COUNT(al.AlbumId) 'Number of Albums'FROM Artists arINNER JOIN Albums ALON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameHAR COUNT(al.AlbumId)> 2ORDER BY 'Number of Albums' DESC;Resultat:
+------------------------+--------------------+ | Kunstnernavn | Antal album ||------------------------+------------------------ || Iron Maiden | 5 || Michael lærer at rocke | 3 || Scriptet | 3 || Tom Jones | 3 || Devin Townsend | 3 |+------------------------+--------------------+Eksempel 7 – Partitionering med OVER-klausulen
Du kan bruge
OVER
klausul medPARTITION BY
at opdele resultaterne i partitioner.I dette eksempel bruger jeg
OVER (PARTITION BY ArtistName)
for at liste hvert album, som kunstneren har produceret, samt det samlede antal albums for den pågældende kunstner.SELECT ArtistName, AlbumName, COUNT(AlbumId) OVER (OPDELING EFTER ArtistName) 'Antal album fra denne kunstner'FRA Kunstnere arINNER JOIN Albums ALON al.ArtistId =ar.ArtistIdORDER BY 'Antal albums fra denne kunstner' DESC;Resultat:
+------------------------+--------------------- -----+--------------------------------------------+| Kunstnernavn | Albumnavn | Antal album fra denne kunstner ||------------------------+---------------- ----------+--------------------------------------------|| Iron Maiden | Powerslave | 5 || Iron Maiden | Et eller andet sted i tiden | 5 || Iron Maiden | Piece of Mind | 5 || Iron Maiden | Mordere | 5 || Iron Maiden | Ingen bøn for døende | 5 || AC/DC | Powerage | 3 || AC/DC | Tilbage i sort | 3 || AC/DC | Rock eller Bust | 3 || Michael lærer at rocke | Blå nat | 3 || Michael lærer at rocke | Evigheden | 3 || Michael lærer at rocke | Skandinavien | 3 || Devin Townsend | Ziltoid den alvidende | 3 || Devin Townsend | Ofre af Cool | 3 || Devin Townsend | Epicloud | 3 || Tom Jones | Langt tabt kuffert | 3 || Tom Jones | Ros og skyld | 3 || Tom Jones | Sammen kom Jones | 3 || Allan Holdsworth | Hele natten forkert | 2 || Allan Holdsworth | De seksten mænd fra Tain | 2 || Buddy Rich | Big Swing Face | 1 || Jim Reeves | Singing Down the Lane | 1 || Scriptet | Ingen lyd uden stilhed | 1 |+------------------------+---------------------- ----+--------------------------------------------+Bemærk, at dette bevirker, at antallet af kunstnere og album gentages på tværs af flere rækker, men det kan forventes, når vi også ønsker at liste hvert album i sin egen række.
Eksempel 8 – Med STRING_AGG()
Hvis du ikke ønsker, at hvert kunstner- og albumantal skal gentages på tværs af flere rækker som i det foregående eksempel, kan du altid bruge
STRING_AGG()
funktion til at udlæse albummer som en liste. I dette tilfælde har du ikke brug forOVER
klausul.Eksempel:
SELECT ArtistName, STRING_AGG(AlbumName, ', ') 'Albums', COUNT(AlbumId) 'Count'FROM Artists arINNER JOIN Albums ALON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameORDER BY 'Count' DESC;Resultat:
+------------------------+--------------------- -------------------------------------------------- ----------+---------+| Kunstnernavn | Albums | Tæl ||------------------------+---------------------- -------------------------------------------------- ----+---------|| Iron Maiden | Powerslave, Somewhere in Time, Piece of Mind, Killers, No Prayer for the Dying | 5 || AC/DC | Powerage, tilbage i sort, rock eller buste | 3 || Michael lærer at rocke | Blue Night, Eternity, Skandinavien | 3 || Devin Townsend | Ziltoid den Alvidende, Ofre for Cool, Epicloud | 3 || Tom Jones | Langt tabt kuffert, ros og skyld, sammen kom Jones | 3 || Allan Holdsworth | All Night Wrong, The Sixteen Men of Tain | 2 || Buddy Rich | Big Swing Face | 1 || Jim Reeves | Singing Down the Lane | 1 || Scriptet | Ingen lyd uden stilhed | 1 |+------------------------+---------------------- -------------------------------------------------- --------+---------+MASSER af rækker?
COUNT()
funktion returnerer sit resultat som en int datatype. Hvis du har så mange rækker, at resultatet er større end hvad int kan håndtere, prøvCOUNT_BIG()
i stedet.
COUNT_BIG()
virker på samme måde somCOUNT()
, bortset fra at dens resultater returneres som en bigint datatypeværdi.Du kan også overveje at bruge
APPROX_COUNT_DISTINCT()
i nogle tilfælde.
APPROX_COUNT_DISTINCT()
returnerer en omtrentlig værdi i stedet for en præcis værdi. Det er dog designet til at være meget mere responsivt endCOUNT()
ogCOUNT_BIG()
, så det kunne være nyttigt i perioder, hvor lydhørhed er vigtigere end præcision.Det er designet til at returnere unikke, ikke-nul-værdier, så det ville kun være relevant på tidspunkter, hvor du normalt ville bruge
DISTINCT
klausul medCOUNT_BIG()
.Bemærk også, at i skrivende stund
APPROX_COUNT_DISTINCT()
er i offentlig forhåndsvisningsstatus.