Share via


GRAAF (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric

Met deze functie wordt het aantal items in een groep geretourneerd. COUNT werkt als de functie COUNT_BIG . Deze functies verschillen alleen in de gegevenstypen van hun retourwaarden. COUNTretourneert altijd een int-gegevenstypewaarde. COUNT_BIG retourneert altijd een waarde voor het gegevenstype bigint .

Transact-SQL syntaxis-conventies

Syntaxis

Syntaxis van aggregatiefunctie:

COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )

Syntaxis van analysefunctie:

COUNT ( { [ ALL ] expression | * } ) OVER ( [ <partition_by_clause> ] )

Argumenten

ALLE

Hiermee past u de statistische functie toe op alle waarden. ALL fungeert als de standaardwaarde.

ONDERSCHEIDEND

Hiermee geeft u op dat COUNT het aantal unieke niet-null-waarden wordt geretourneerd.

expressie

Een expressie van elk type, met uitzondering van afbeelding, ntext of tekst. COUNT biedt geen ondersteuning voor statistische functies of subquery's in een expressie.

*

Hiermee geeft u op dat COUNT alle rijen moeten worden geteld om het totale aantal tabelrijen te bepalen dat moet worden geretourneerd. COUNT(*) accepteert geen parameters en biedt geen ondersteuning voor het gebruik van DISTINCT. COUNT(*) vereist geen expressieparameter omdat deze per definitie geen informatie over een bepaalde kolom gebruikt. COUNT(*) retourneert het aantal rijen in een opgegeven tabel en behoudt dubbele rijen. Het telt elke rij apart, inclusief rijen die nullwaarden bevatten.

OVER ( [ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ] )

De partition_by_clause verdeelt de resultatenset die door de FROM component wordt geproduceerd in partities waarop de COUNT functie wordt toegepast. Als deze niet is opgegeven, behandelt de functie alle rijen van de queryresultatenset als één groep. De order_by_clause bepaalt de logische volgorde van de bewerking. Zie OVER-component voor meer informatie.

Retourtypen

  • Retourneert int NOT NULL wanneer ANSI_WARNINGS dit is ON. SQL Server behandelt COUNT echter altijd expressies als int NULL in metagegevens, tenzij verpakt in ISNULL.

  • Retourneert int NULL wanneer ANSI_WARNINGS dit is OFF.

Opmerkingen

COUNT(*) zonder GROUP BY geeft als resultaat de kardinaliteit (aantal rijen) in de resultatenset. Dit aantal omvat rijen met alle NULL waarden en duplicaten.

COUNT(*) met GROUP BY geeft als resultaat het aantal rijen in elke groep. Dit aantal omvat NULL waarden en duplicaten.

COUNT(ALL <expression>) evalueert expressies voor elke rij in een groep en retourneert het aantal niet-null-waarden.

COUNT(DISTINCT <expression>) evalueert expressies voor elke rij in een groep en retourneert het aantal unieke, niet-null-waarden.

Deterministisch en niet-deterministisch gebruik

COUNT_BIG is een deterministische functie wanneer deze wordt gebruikt zonder de OVER en ORDER BY componenten.

COUNT_BIG is niet-deterministisch wanneer deze wordt gebruikt met de OVER en ORDER BY componenten.

Maakt gebruik OVER van en ORDER BY componenten Deterministisch
Nee. Yes
Yes Nee.

Zie Deterministische en niet-deterministische functiesvoor meer informatie.

ARITHABORT en ANSI_WARNINGS

  • Wanneer COUNT een waarde wordt geretourneerd die groter is dan de maximumwaarde van int (231-1 of 2.147.483.647), mislukt de functie vanwege een overloop van een geheel getal.

  • Als COUNT overloop en zowel de opties als de ARITHABORT opties ANSI_WARNINGS zijn OFF, COUNT retourneert NULL. Als dat nietARITHABORTANSI_WARNINGS het geval is ON, wordt de query afgebroken en wordt de rekenkundige overloopfout gegenereerd:

    Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int.
    

    Als u deze grote resultaten correct wilt afhandelen, gebruikt u in plaats daarvan COUNT_BIG , die bigint retourneert.

  • Als beide ARITHABORT en ANSI_WARNINGS beide zijnON, kunt u oproepsites ISNULL( <count-expr>, 0) veilig verpakken COUNT om het type van de expressie te dwingen int NOT NULL in plaats van int NULL. COUNT Verpakken in ISNULL betekent dat elke overloopfout op de achtergrond wordt onderdrukt, wat moet worden overwogen voor juistheid.

Voorbeelden

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

Eén. AANTAL en DISTINCT gebruiken

In dit voorbeeld wordt het aantal verschillende functietitels in de HumanResources.Employee tabel geretourneerd die een werknemer kan bevatten.

SELECT COUNT(DISTINCT JobTitle)
FROM HumanResources.Employee;
GO

Hier is het resultatenoverzicht.

-----------
67

B. AANTAL(*) gebruiken

In dit voorbeeld wordt het totale aantal werknemers in de HumanResources.Employee tabel geretourneerd.

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

Hier is het resultatenoverzicht.

-----------
290

C. COUNT(*) gebruiken met andere aggregaties

In dit voorbeeld ziet u dat COUNT(*) dit werkt met andere statistische functies in de SELECT lijst.

SELECT COUNT(*), AVG(Bonus)
FROM Sales.SalesPerson
WHERE SalesQuota > 25000;
GO

Hier is het resultatenoverzicht.

------ ---------------------
14     3472.1428

D. De OVER-clausule gebruiken

In dit voorbeeld worden de MINfuncties , MAXen COUNTAVGfuncties met de OVER component gebruikt om geaggregeerde waarden te retourneren voor elke afdeling in de HumanResources.Department tabel.

SELECT DISTINCT d.Name,
                MIN(eph.Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary,
                MAX(eph.Rate) OVER (PARTITION BY edh.DepartmentID) AS MaxSalary,
                AVG(eph.Rate) OVER (PARTITION BY edh.DepartmentID) AS AvgSalary,
                COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept
FROM HumanResources.EmployeePayHistory AS eph
     INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
         ON eph.BusinessEntityID = edh.BusinessEntityID
     INNER JOIN HumanResources.Department AS d
         ON d.DepartmentID = edh.DepartmentID
WHERE edh.EndDate IS NULL
ORDER BY d.Name;

Hier is het resultatenoverzicht.

Name                         MinSalary   MaxSalary   AvgSalary   EmployeesPerDept
---------------------------- ----------- ----------- ----------- -----------------
Document Control             10.25       17.7885     14.3884     5
Engineering                  32.6923     63.4615     40.1442     6
Executive                    39.06       125.50      68.3034     4
Facilities and Maintenance   9.25        24.0385     13.0316     7
Finance                      13.4615     43.2692     23.935      10
Human Resources              13.9423     27.1394     18.0248     6
Information Services         27.4038     50.4808     34.1586     10
Marketing                    13.4615     37.50       18.4318     11
Production                   6.50        84.1346     13.5537     195
Production Control           8.62        24.5192     16.7746     8
Purchasing                   9.86        30.00       18.0202     14
Quality Assurance            10.5769     28.8462     15.4647     6
Research and Development     40.8654     50.4808     43.6731     4
Sales                        23.0769     72.1154     29.9719     18
Shipping and Receiving       9.00        19.2308     10.8718     6
Tool Design                  8.62        29.8462     23.5054     6

Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)

E. AANTAL en DISTINCT gebruiken

In dit voorbeeld wordt het aantal verschillende titels geretourneerd dat een werknemer van een specifiek bedrijf kan bevatten.

USE ssawPDW;
SELECT COUNT(DISTINCT Title)
FROM dbo.DimEmployee;

Hier is het resultatenoverzicht.

-----------
67

F. AANTAL(*) gebruiken

In dit voorbeeld wordt het totale aantal rijen in de dbo.DimEmployee tabel geretourneerd.

USE ssawPDW;
SELECT COUNT(*)
FROM dbo.DimEmployee;

Hier is het resultatenoverzicht.

-------------
296

G. COUNT(*) gebruiken met andere aggregaties

In dit voorbeeld worden COUNT(*) andere statistische functies in de SELECT lijst gecombineerd. Het retourneert het aantal verkoopvertegenwoordigers met een jaarlijks verkoopquotum dat groter is dan $ 500.000 en het gemiddelde verkoopquotum van deze verkoopvertegenwoordigers.

USE ssawPDW;
SELECT COUNT(EmployeeKey) AS TotalCount,
       AVG(SalesAmountQuota) AS [Average Sales Quota]
FROM dbo.FactSalesQuota
WHERE SalesAmountQuota > 500000
      AND CalendarYear = 2001;

Hier is het resultatenoverzicht.

TotalCount  Average Sales Quota
----------  -------------------
10          683800.0000

H. COUNT gebruiken met HAVING

In dit voorbeeld wordt COUNT gebruikgemaakt van de HAVING component om de afdelingen van een bedrijf te retourneren, die elk meer dan 15 werknemers hebben.

USE ssawPDW;
SELECT DepartmentName,
       COUNT(EmployeeKey) AS EmployeesInDept
FROM dbo.DimEmployee
GROUP BY DepartmentName
HAVING COUNT(EmployeeKey) > 15;

Hier is het resultatenoverzicht.

DepartmentName  EmployeesInDept
--------------  ---------------
Sales           18
Production      179

Ik. COUNT gebruiken met OVER

In dit voorbeeld wordt COUNT gebruikgemaakt van de OVER component om het aantal producten in elk van de opgegeven verkooporders te retourneren.

USE ssawPDW;
SELECT DISTINCT COUNT(ProductKey) OVER (PARTITION BY SalesOrderNumber) AS ProductCount,
                SalesOrderNumber
FROM dbo.FactInternetSales
WHERE SalesOrderNumber IN (N'SO53115', N'SO55981');

Hier is het resultatenoverzicht.

ProductCount   SalesOrderID
------------   -----------------
3              SO53115
1              SO55981