Udostępnij za pomocą


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 nonnull.

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 parametrów i nie obsługuje użycia funkcji 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. Zlicza każdy wiersz oddzielnie. Obejmuje to wiersze zawierające wartości null.

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 (Transact-SQL).

Typy zwracane

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

  • int NULL , gdy ANSI_WARNINGS ma wartość OFF.

Uwagi

  • COUNT(*) bez GROUP BY zwraca kardynalności (liczba wierszy) w zestawie wyników. Obejmuje to wiersze składające się z wartości wszystkichNULL i duplikatów.
  • COUNT(*) funkcja z GROUP BY zwraca liczbę wierszy w każdej grupie. NULL Obejmuje to wartości i duplikaty.
  • COUNT(ALL <expression>) oblicza wyrażenie dla każdego wiersza w grupie i zwraca liczbę wartości innych niż.
  • COUNT(DISTINCT <expression>) oblicza wyrażenie dla każdego wiersza w grupie i zwraca liczbę unikatowych wartości innych niż.

COUNT jest funkcją deterministyczną, gdy jest używana bez klauzul OVER i ORDER BY. Jest on niedeterministyczny w przypadku użycia z klauzulami OVER i ORDER BY. Aby uzyskać więcej informacji, zobacz funkcje deterministyczne i niedeterministyczne.

ARITHABORT i ANSI_WARNINGS

Jeśli COUNT wartość zwracana przekracza maksymalną wartość int (czyli 231–1 lub 2 147 483 647), COUNT funkcja zakończy się niepowodzeniem z powodu przepełnienia liczby całkowitej. Gdy COUNT przepełnienie i obieARITHABORTANSI_WARNINGS opcje to OFF, COUNT zwróci wartość NULL. W przeciwnym razie, gdy jeden z elementów ARITHABORT lub ANSI_WARNINGS ma ONwartość , zapytanie zostanie przerwane i zostanie zgłoszony błąd Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int. przepełnienia arytmetycznego. Aby poprawnie obsłużyć te duże wyniki, należy użyć polecenia COUNT_BIG , który zwraca wartość bigint.

W przypadku obu ARITHABORT elementów i ANSI_WARNINGSONmożna bezpiecznie opakowować COUNT wywołania w pliku , ISNULL( <count-expr>, 0 ) aby wymuś typ int NOT NULL wyrażenia zamiast int NULL. Zawijanie COUNT w ISNULL systemie oznacza, że wszelkie błędy przepełnienia będą dyskretnie pomijane, co powinno być brane pod uwagę pod kątem poprawności.

Przykłady

Odp. Używanie funkcji COUNT i DISTINCT

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

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

Oto zestaw wyników.

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

B. Użyj funkcji COUNT(*)

Ten przykład zwraca łączną liczbę pracowników Adventure Works Cycles.

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

Oto zestaw wyników.

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

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. Przykład wykorzystuje bazę danych AdventureWorks2025.

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

Oto zestaw wyników.

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

D. Używanie klauzuli OVER

Ten przykład wykorzystuje MIN, MAX, AVG i funkcjonuje COUNT z klauzulą OVER , aby zwracać zagregowane wartości dla każdego działu w tabeli bazy HumanResources.Department danych AdventureWorks2025.

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;

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
  
(16 row(s) affected)

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

Zobacz także