Freigeben über


ANZAHL (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-Analyseendpunkt in Microsoft FabricLagerhaus in Microsoft FabricSQL-Datenbank in Microsoft Fabric

Diese Funktion gibt die Anzahl der in einer Gruppe gefundenen Elemente zurück. COUNT arbeitet wie die COUNT_BIG-Funktion. Diese Funktionen unterscheiden sich nur in den Datentypen ihrer Rückgabewerte. COUNT gibt immer einen Wert vom Datentyp int zurück. COUNT_BIG gibt immer einen Wert vom Datentyp bigint zurück.

Transact-SQL-Syntaxkonventionen

Syntax

Syntax der Aggregationsfunktion:

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

Analysefunktionssyntax:

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

Argumente

ALLE

Wendet die Aggregatfunktion auf alle Werte an. ALL dient als Standard.

EINDEUTIG

Gibt an, dass COUNT die Anzahl eindeutiger Nicht-Null-Werte zurückgegeben wird.

Ausdruck

Eine expression beliebigen Typs mit Ausnahme von image, ntext oder text. COUNT unterstützt keine Aggregatfunktionen oder Unterabfragen in einem Ausdruck.

*

Gibt an, dass COUNT alle Zeilen zählen soll, um die Gesamtzahl der zurückzugebenden Tabellenzeilen zu bestimmen. COUNT(*) verwendet keine Parameter und unterstützt nicht die Verwendung von DISTINCT. COUNT(*) erfordert keinen expression-Parameter, da definitionsgemäß keine Informationen zu einer bestimmten Spalte verwendet werden. COUNT(*) gibt die Anzahl der Zeilen in einer angegebenen Tabelle zurück. Duplikate werden beibehalten. Die Funktion zählt jede Zeile separat, einschließlich der Zeilen, die null-Werte enthalten.

OVER ( [ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ]

Das Argument partition_by_clause unterteilt das von der FROM-Klausel erzeugte Resultset in Partitionen, auf die die COUNT-Funktion angewendet wird. Wird dies nicht angegeben, verarbeitet die Funktion alle Zeilen des Abfrageresultsets als einzelne Gruppe. order_by_clause bestimmt die logische Reihenfolge, in der der Vorgang ausgeführt wird. Weitere Informationen finden Sie unter OVER-Klausel.

Rückgabetypen

  • Gibt int NOT NULL zurück, wenn ANSI_WARNINGS der Wert ist ON. SQL Server behandelt COUNT ausdrücke jedoch immer als int NULL in Metadaten, es sei denn, es wird in ISNULLden Umbruch eingeschlossen.

  • Gibt int NULL zurück, wenn ANSI_WARNINGS der Wert ist OFF.

Bemerkungen

COUNT(*) ohne GROUP BY die Kardinalität (Anzahl der Zeilen) im Resultset zurück. Diese Anzahl enthält Zeilen mit allen NULL Werten und Duplikaten.

COUNT(*) mit GROUP BY gibt die Anzahl der Zeilen in jeder Gruppe zurück. Diese Anzahl enthält NULL Werte und Duplikate.

COUNT(ALL <expression>) Wertet ausdrücke für jede Zeile in einer Gruppe aus und gibt die Anzahl der Nicht-NULL-Werte zurück.

COUNT(DISTINCT <expression>) Wertet ausdrücke für jede Zeile in einer Gruppe aus und gibt die Anzahl eindeutiger, nicht NULL-Werte zurück.

Deterministische und nichtdeterministische Verwendung

COUNT_BIG ist eine deterministische Funktion, wenn sie ohne die OVER Und-Klauseln ORDER BY verwendet wird.

COUNT_BIG ist nicht deterministisch , wenn sie mit den OVER Und-Klauseln ORDER BY verwendet wird.

Verwendung OVER und ORDER BY Klauseln Deterministisch
Nein Yes
Yes Nein

Weitere Informationen finden Sie unter Deterministische und nicht deterministische Funktionen.

ARITHABORT und ANSI_WARNINGS

  • Wenn COUNT ein Wert zurückgegeben wird, der den Maximalwert von int (231-1 oder 2.147.483.647) überschreitet, schlägt die Funktion aufgrund eines ganzzahligen Überlaufs fehl.

  • Wenn COUNT Überläufe und sowohl die Optionen als ANSI_WARNINGSauch die ARITHABORT Überlaufoptionen sindOFF, wird COUNT zurückgegebenNULL. Andernfalls wird die Abfrage abgebrochen und löst den arithmetischen Überlauffehler aus:ARITHABORTANSI_WARNINGSON

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

    Um diese großen Ergebnisse korrekt zu behandeln, verwenden Sie stattdessen COUNT_BIG , die "bigint" zurückgibt.

  • Wenn beides ARITHABORT istONANSI_WARNINGS, können Sie Aufrufwebsites ISNULL( <count-expr>, 0) sicher umschließenCOUNT, um den Typ des Ausdrucks in "NICHT NULL" statt int NULL zu überstellen. Das Umbrechen COUNT bedeutet ISNULL , dass alle Überlauffehler im Hintergrund unterdrückt werden, die als Korrektheit betrachtet werden sollten.

Beispiele

Die Codebeispiele in diesem Artikel verwenden die AdventureWorks2025- oder AdventureWorksDW2025 Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage herunterladen können.

Ein. Verwenden von COUNT und DISTINCT

In diesem Beispiel wird die Anzahl der verschiedenen Stellentitel in der Tabelle zurückgegeben, die HumanResources.Employee ein Mitarbeiter enthalten kann.

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

Hier sehen Sie das Ergebnis.

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

B. Verwenden von COUNT(*)

In diesem Beispiel wird die Gesamtzahl der Mitarbeiter in der HumanResources.Employee Tabelle zurückgegeben.

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

Hier sehen Sie das Ergebnis.

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

C. Verwenden von COUNT(*) mit weiteren Aggregaten

Dieses Beispiel zeigt, dass COUNT(*) mit anderen Aggregatfunktionen in der SELECT-Liste funktioniert.

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

Hier sehen Sie das Ergebnis.

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

D: Verwenden der OVER-Klausel

In diesem Beispiel werden die , , und COUNT Funktionen mit der OVER Klausel verwendet, um aggregierte Werte für jede Abteilung in der HumanResources.Department Tabelle zurückzugeben. AVGMAXMIN

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 sehen Sie das Ergebnis.

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

Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)

E. Verwenden von COUNT und DISTINCT

Dieses Beispiel gibt die Anzahl der verschiedenen Positionen zurück, die ein Mitarbeiter eines bestimmten Unternehmens innehaben kann.

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

Hier sehen Sie das Ergebnis.

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

F. Verwenden von COUNT(*)

In diesem Beispiel wird die Gesamtzahl der Zeilen in der dbo.DimEmployee-Tabelle zurückgegeben.

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

Hier sehen Sie das Ergebnis.

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

G. Verwenden von COUNT(*) mit weiteren Aggregaten

Dieses Beispiel vereint COUNT(*) mit weiteren Aggregatfunktionen in der SELECT-Liste. Es gibt die Anzahl der Vertriebsmitarbeiter mit einer jährlichen Sollvorgabe für den Verkauf von über 500.000 USD und die durchschnittliche Sollvorgabe dieser Vertriebsmitarbeiter für den Verkauf zurück.

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

Hier sehen Sie das Ergebnis.

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

H. Verwenden von COUNT mit HAVING

Dieses Beispiel verwendet COUNT mit der HAVING-Klausel, um die Abteilungen einer Firma zurückzugeben, von denen jede mehr als 15 Mitarbeiter aufweist.

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

Hier sehen Sie das Ergebnis.

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

Ich. Verwenden von COUNT mit OVER

In diesem Beispiel wird COUNT mit der OVER-Klausel verwendet, um die Anzahl der enthaltenen Produkte für jeden der angegebenen Verkaufsaufträge zurückzugeben.

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

Hier sehen Sie das Ergebnis.

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