Udostępnij przez


COUNT (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Ta funkcja zwraca liczbę elementów znalezionych w grupie. COUNT działa jak funkcja COUNT_BIG . Te funkcje różnią się tylko typami danych zwracanych wartości. COUNT zawsze zwraca wartość typu danych int . COUNT_BIG zawsze zwraca wartość typu danych bigint .

Transact-SQL konwencje składni

Składnia

Składnia funkcji agregacji:

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

Składnia funkcji analitycznej:

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

Argumenty (w programowaniu)

Wszystkie

Stosuje funkcję agregacji do wszystkich wartości. ALL służy jako wartość domyślna.

ODMIENNY

Określa, że COUNT zwraca liczbę unikatowych wartości innych niż null.

wyrażenie

Wyrażenie dowolnego typu, z wyjątkiem obrazu, ntekstu lub tekstu. COUNT nie obsługuje funkcji agregujących ani podzapytania w wyrażeniu.

*

Określa, że COUNT ma zliczać wszystkie wiersze, aby określić łączną liczbę wierszy tabeli do zwrócenia. COUNT(*) nie przyjmuje żadnych parametrów i nie obsługuje użycia metody DISTINCT. COUNT(*) nie wymaga parametru wyrażenia , ponieważ z definicji nie używa informacji o żadnej konkretnej kolumnie. COUNT(*) Zwraca liczbę wierszy w określonej tabeli i zachowuje zduplikowane wiersze. Liczy każdy wiersz osobno, w tym wiersze zawierające wartości zerowe.

KONIEC ( [ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ] )

Partition_by_clause dzieli zestaw wyników generowany przez klauzulę FROM na partycje, do których COUNT jest stosowana funkcja. Jeśli nie zostanie określony, funkcja traktuje wszystkie wiersze zestawu wyników zapytania jako pojedynczą grupę. Order_by_clause określa kolejność logiczną operacji. Aby uzyskać więcej informacji, zobacz klauzulę OVER.

Typy zwracane

  • Zwraca wartość int NOT NULL, gdy ANSI_WARNINGS ma wartość .ON Jednak program SQL Server zawsze traktuje COUNT wyrażenia jako int NULL w metadanych, chyba że jest opakowany w ISNULL.

  • Zwraca wartość null int, gdy ANSI_WARNINGS ma wartość OFF.

Uwagi

COUNT(*) bez GROUP BY zwraca kardynalności (liczba wierszy) w zestawie wyników. Ta liczba obejmuje wiersze, które mają wszystkie NULL wartości i duplikaty.

COUNT(*) funkcja z GROUP BY zwraca liczbę wierszy w każdej grupie. Ta liczba obejmuje NULL wartości i duplikaty.

COUNT(ALL <expression>) oblicza wyrażenie dla każdego wiersza w grupie i zwraca liczbę wartości innych niż null.

COUNT(DISTINCT <expression>) oblicza wyrażenie dla każdego wiersza w grupie i zwraca liczbę unikatowych wartości innych niż null.

Deterministyczne i nieokreślone użycie

COUNT_BIG jest funkcją deterministyczną , gdy jest używana bezOVER klauzul i ORDER BY .

COUNT_BIG jest niedeterministyczny w przypadku użycia z klauzulamiOVER i ORDER BY .

Używa OVER klauzul i ORDER BY Deterministyczny
Nie. Tak
Tak Nie.

Aby uzyskać więcej informacji, zobacz funkcje deterministyczne i niedeterministyczne.

ARITHABORT i ANSI_WARNINGS

  • Gdy COUNT zwraca wartość, która przekracza maksymalną wartość int (231–1 lub 2 147 483 647), funkcja kończy się niepowodzeniem z powodu przepełnienia liczby całkowitej.

  • Jeśli COUNT przepełnienie i obieARITHABORTANSI_WARNINGS opcje to OFF, COUNT zwraca wartość NULL. W przeciwnym razie, jeśli elementARITHABORT lub ANSI_WARNINGS ma ONwartość , zapytanie przerywa i zgłasza błąd przepełnienia arytmetycznego:

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

    Aby poprawnie obsłużyć te duże wyniki, użyj COUNT_BIG zamiast tego, co zwraca bigint.

  • Gdy obie ARITHABORT wartości i ANSI_WARNINGSON, można bezpiecznie opakowować COUNT wywołania lokacji w ISNULL( <count-expr>, 0) , aby coerce typ wyrażenia do int NOT NULL zamiast intnull. Zawijanie COUNT w systemie ISNULL oznacza, że wszelkie błędy przepełnienia są dyskretnie pomijane, co należy wziąć pod uwagę pod kątem poprawności.

Przykłady

Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.

Odp. Używanie funkcji COUNT i DISTINCT

W tym przykładzie jest zwracana liczba różnych tytułów pracy w HumanResources.Employee tabeli, które może pomieścić pracownik.

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

Oto zestaw wyników.

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

B. Użyj funkcji COUNT(*)

Ten przykład zwraca łączną liczbę pracowników w HumanResources.Employee tabeli.

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

Oto zestaw wyników.

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

C. Używanie funkcji COUNT(*) z innymi agregacjami

W tym przykładzie pokazano, że COUNT(*) działa z innymi funkcjami agregacji na SELECT liście.

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

Oto zestaw wyników.

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

D. Używanie klauzuli OVER

W tym przykładzie MINużyto funkcji , MAX, AVGi COUNT z klauzulą OVER , aby zwrócić zagregowane wartości dla każdego działu w HumanResources.Department tabeli.

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;

Oto zestaw wyników.

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

Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)

E. Używanie funkcji COUNT i DISTINCT

W tym przykładzie jest zwracana liczba różnych tytułów, które może pomieścić pracownik określonej firmy.

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

Oto zestaw wyników.

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

F. Użyj funkcji COUNT(*)

Ten przykład zwraca łączną liczbę wierszy w dbo.DimEmployee tabeli.

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

Oto zestaw wyników.

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

G. Używanie funkcji COUNT(*) z innymi agregacjami

Ten przykład łączy się COUNT(*) z innymi funkcjami agregacji na SELECT liście. Zwraca liczbę przedstawicieli sprzedaży z rocznym limitem sprzedaży większym niż 500 000 USD oraz średnią kwotą sprzedaży tych przedstawicieli sprzedaży.

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

Oto zestaw wyników.

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

H. Używanie funkcji COUNT z UŻYCIEM

W tym przykładzie COUNT użyto HAVING klauzuli z klauzulą , aby zwrócić działy firmy, z których każdy ma więcej niż 15 pracowników.

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

Oto zestaw wyników.

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

Ja. Używanie funkcji COUNT z funkcją OVER

W tym przykładzie użyto COUNT klauzuli z klauzulą OVER , aby zwrócić liczbę produktów zawartych w każdym z określonych zamówień sprzedaży.

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

Oto zestaw wyników.

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