Delen via


COUNT (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricWarehouse 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-ullwaarden 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(*) gebruikt 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. Elke rij wordt afzonderlijk geteld. Dit omvat rijen die null-waarden 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 (Transact-SQL) voor meer informatie.

Retourtypen

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

  • int NULL wanneer ANSI_WARNINGS is OFF.

Opmerkingen

  • COUNT(*) zonder GROUP BY de kardinaliteit (aantal rijen) in de resultatenset te retourneren. Dit omvat rijen die bestaan uit alleNULL waarden en duplicaten.
  • COUNT(*) met GROUP BY geeft als resultaat het aantal rijen in elke groep. Dit omvat NULL waarden en duplicaten.
  • COUNT(ALL <expression>) evalueert de expressie voor elke rij in een groep en retourneert het aantal niet-ullwaarden.
  • COUNT(DISTINCT <expression>) evalueert expressies voor elke rij in een groep en retourneert het aantal unieke, niet-ullwaarden.

COUNT is een deterministische functie wanneer deze wordt gebruikt zonder de OVER- en ORDER BY-componenten. Het is niet-deterministisch wanneer deze wordt gebruikt met de OVER- en ORDER BY-componenten. Zie Deterministische en niet-deterministische functiesvoor meer informatie.

ARITHABORT en ANSI_WARNINGS

Wanneer COUNT een retourwaarde de maximumwaarde van int overschrijdt (dat wil gezegd: 231-1 of 2.147.483.647), mislukt de COUNT functie vanwege een overloop van een geheel getal. Wanneer COUNT overloop en zowel de opties als de ARITHABORT opties ANSI_WARNINGS zijn OFF, COUNT wordt geretourneerd NULL. Als dit nietARITHABORTANSI_WARNINGS het geval is ON, wordt de query afgebroken en wordt de rekenkundige overloopfout Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int. gegenereerd. Als u deze grote resultaten correct wilt afhandelen, gebruikt COUNT_BIG u in plaats daarvan, dat 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 int NOT NULL dwingen in plaats van int NULL. COUNT ISNULL Inpakken betekent dat elke overloopfout op de achtergrond wordt onderdrukt, wat moet worden overwogen voor juistheid.

Voorbeelden

Eén. AANTAL en DISTINCT gebruiken

In dit voorbeeld wordt het aantal verschillende titels geretourneerd dat een werknemer Adventure Works Cycles kan bevatten.

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

Hier is het resultatenoverzicht.

-----------
67
  
(1 row(s) affected)

B. AANTAL(*) gebruiken

In dit voorbeeld wordt het totale aantal werknemers van Adventure Works Cycles geretourneerd.

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

Hier is het resultatenoverzicht.

-----------
290
  
(1 row(s) affected)

C. COUNT(*) gebruiken met andere aggregaties

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

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

Hier is het resultatenoverzicht.

----------- ---------------------
14            3472.1428
  
(1 row(s) affected)

D. De OVER-clausule gebruiken

In dit voorbeeld worden de MIN, AVGMAXen COUNT functies met de OVER component gebruikt om geaggregeerde waarden te retourneren voor elke afdeling in de databasetabel HumanResources.Department AdventureWorks2022.

SELECT DISTINCT Name
    , MIN(Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary
    , MAX(Rate) OVER (PARTITION BY edh.DepartmentID) AS MaxSalary
    , AVG(Rate) OVER (PARTITION BY edh.DepartmentID) AS AvgSalary
    , COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept
FROM HumanResources.EmployeePayHistory AS eph
JOIN HumanResources.EmployeeDepartmentHistory AS edh
    ON eph.BusinessEntityID = edh.BusinessEntityID
JOIN HumanResources.Department AS d
ON d.DepartmentID = edh.DepartmentID
WHERE edh.EndDate IS NULL
ORDER BY 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
  
(16 row(s) affected)

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

Zie ook