Dela via


COUNT (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft Fabric

Den här funktionen returnerar antalet objekt som finns i en grupp. COUNT fungerar som funktionen COUNT_BIG . Dessa funktioner skiljer sig bara åt i datatyperna för deras returvärden. COUNT returnerar alltid ett värde för int-datatyp . COUNT_BIG returnerar alltid ett värde för storint datatyp.

Transact-SQL syntaxkonventioner

Syntax

Syntax för sammansättningsfunktion

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

Analysfunktionssyntax

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

Argumentpunkter

ALLA

Tillämpar aggregeringsfunktionen på alla värden. ALLA fungerar som standard.

SÄRSKILD

Anger som COUNT returnerar antalet unika icke-inullade värden.

uttryck

Ett uttryck av valfri typ, förutom bild, ntext eller text. COUNT stöder inte aggregerade funktioner eller underfrågor i ett uttryck.

*

Anger som COUNT ska räkna alla rader för att fastställa det totala antalet tabellrader som ska returneras. COUNT(*) tar inga parametrar och stöder inte användningen av DISTINCT. COUNT(*) kräver ingen uttrycksparameter eftersom den per definition inte använder information om någon viss kolumn. COUNT(*) returnerar antalet rader i en angiven tabell och bevarar dubblettrader. Varje rad räknas separat. Detta inkluderar rader som innehåller null-värden.

ÖVER ( [ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ] )

Partition_by_clause delar upp resultatuppsättningen FROM som genereras av -satsen i partitioner som COUNT funktionen tillämpas på. Om det inte anges behandlar funktionen alla rader i frågeresultatuppsättningen som en enda grupp. Den order_by_clause avgör åtgärdens logiska ordning. Mer information finns i OVER-satsen (Transact-SQL).

Returtyper

  • int NOT NULL when ANSI_WARNINGS is ON, however SQL Server will always treat COUNT expressions as int NULL in metadata, unless wrapped in ISNULL.

  • int NULL när ANSI_WARNINGS är OFF.

Anmärkningar

  • COUNT(*) utan GROUP BY returnerar kardinaliteten (antalet rader) i resultatuppsättningen. Detta inkluderar rader som består av allaNULL värden och dubbletter.
  • COUNT(*) med GROUP BY returnerar antalet rader i varje grupp. Detta inkluderar NULL värden och dubbletter.
  • COUNT(ALL <expression>) utvärderar uttryck för varje rad i en grupp och returnerar antalet icke-inullade värden.
  • COUNT(DISTINCT <expression>) utvärderar uttryck för varje rad i en grupp och returnerar antalet unika, icke-inullade värden.

COUNT är en deterministisk funktion när den används utan OVER- och ORDER BY-satserna. Det är nondeterministiskt när det används med OVER- och ORDER BY-satserna. Mer information finns i deterministiska och icke-terministiska funktioner.

ARITHABORT och ANSI_WARNINGS

När COUNT har ett returvärde som överstiger det maximala värdet för int (dvs. 231–1 eller 2 147 483 647) COUNT misslyckas funktionen på grund av ett heltalsspill. När COUNT spill och bådeARITHABORT alternativen och ANSI_WARNINGS är OFF, COUNT returneras NULL. Annars avbryts frågan när någon av ARITHABORT eller ANSI_WARNINGS är ONoch det aritmetiska spillfelet Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int. genereras. Om du vill hantera dessa stora resultat korrekt använder du COUNT_BIG i stället, vilket returnerar bigint.

När både ARITHABORT och ANSI_WARNINGS är ONkan du på ett säkert sätt omsluta COUNT anropswebbplatser för ISNULL( <count-expr>, 0 ) att tvinga uttryckets typ till int NOT NULL i stället för int NULL. Omslutning COUNT i ISNULL innebär att eventuella spillfel ignoreras tyst, vilket bör övervägas för korrekthet.

Exempel

A. Använda COUNT och DISTINCT

Det här exemplet returnerar antalet olika titlar som en adventure works cycles-anställd kan inneha.

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

Här är resultatet.

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

B. Använd COUNT(*)

Det här exemplet returnerar det totala antalet anställda i Adventure Works Cycles.

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

Här är resultatet.

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

C. Använd COUNT(*) med andra aggregeringar

Det här exemplet visar att COUNT(*) fungerar med andra mängdfunktioner i SELECT listan. I exemplet används databasen AdventureWorks2022.

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

Här är resultatet.

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

D. Använd OVER-satsen

I det MINhär exemplet används funktionerna , MAXAVG och COUNT med OVER -satsen för att returnera aggregerade värden för varje avdelning i databastabellen 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;

Här är resultatet.

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)

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

E. Använda COUNT och DISTINCT

Det här exemplet returnerar antalet olika titlar som en anställd på ett visst företag kan inneha.

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

Här är resultatet.

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

F. Använd COUNT(*)

Det här exemplet returnerar det totala antalet rader i dbo.DimEmployee tabellen.

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

Här är resultatet.

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

G. Använd COUNT(*) med andra aggregeringar

Det här exemplet kombineras COUNT(*) med andra mängdfunktioner i SELECT listan. Det returnerar antalet försäljningsrepresentanter med en årlig försäljningskvot som är större än 500 000 USD och den genomsnittliga försäljningskvoten för dessa försäljningsrepresentanter.

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

Här är resultatet.

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

H. Använda COUNT med HAVING

I det HAVING här exemplet används COUNT med -satsen för att returnera avdelningarna i ett företag, som var och en har fler än 15 anställda.

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

Här är resultatet.

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

Jag. Använda COUNT med OVER

Det här exemplet använder COUNT med OVER -satsen för att returnera antalet produkter som ingår i var och en av de angivna försäljningsorder.

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

Här är resultatet.

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

Se även