Sdílet prostřednictvím


COUNT (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Tato funkce vrátí počet položek nalezených ve skupině. COUNT funguje jako funkce COUNT_BIG . Tyto funkce se liší pouze v datových typech jejich návratových hodnot. COUNT vždy vrátí hodnotu int datového typu. COUNT_BIG vždy vrátí hodnotu datového typu bigint .

Transact-SQL konvence syntaxe

Syntaxe

Syntaxe agregační funkce:

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

Syntaxe analytické funkce:

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

Argumenty

VŠICHNI

Použije agregační funkci na všechny hodnoty. ALL slouží jako výchozí.

ODLIŠNÝ

Určuje, že COUNT vrátí počet jedinečných hodnot, které nejsou null.

výrazu

Výraz libovolného typu s výjimkou obrázku, ntextu nebo textu. COUNT nepodporuje agregační funkce ani poddotazy ve výrazu.

*

Určuje, že se má spočítat všechny řádky, COUNT aby bylo možné určit celkový počet řádků tabulky, který se má vrátit. COUNT(*) nepřijímá žádné parametry a nepodporuje použití DISTINCT. COUNT(*) nevyžaduje parametr výrazu , protože podle definice nepoužívá informace o žádném konkrétním sloupci. COUNT(*) vrátí počet řádků v zadané tabulce a zachová duplicitní řádky. Počítá každý řádek zvlášť, včetně řádků obsahujících nulové hodnoty.

KONEC ( [ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ] )

Partition_by_clause rozdělí sadu výsledků vytvořenou FROM klauzulí na oddíly, na které COUNT se funkce použije. Pokud není zadáno, funkce zachází se všemi řádky sady výsledků dotazu jako s jednou skupinou. Order_by_clause určuje logické pořadí operace. Další informace najdete v tématu KLAUZULE OVER.

Návratové typy

  • Vrátí hodnotu int NOT NULL , pokud ANSI_WARNINGS je ON. SQL Server však vždy považuje COUNT výrazy za int NULL v metadatech, pokud nejsou zabaleny .ISNULL

  • Vrátí hodnotu INT NULL , pokud ANSI_WARNINGS je OFF.

Poznámky

COUNT(*) bez GROUP BY vrácení kardinality (počet řádků) v sadě výsledků. Tento počet zahrnuje řádky, které mají všechny NULL hodnoty a duplicity.

COUNT(*) vrátí GROUP BY počet řádků v každé skupině. Tento počet zahrnuje NULL hodnoty a duplicity.

COUNT(ALL <expression>) vyhodnotí výraz pro každý řádek ve skupině a vrátí počet hodnot, které nejsou null.

COUNT(DISTINCT <expression>) vyhodnotí výraz pro každý řádek ve skupině a vrátí počet jedinečných hodnot, které nejsou null.

Deterministické a nedeterministické použití

COUNT_BIG je deterministická funkce při použití bezOVER klauzulí a ORDER BY klauzulí.

COUNT_BIG je nedeterministický při použití sOVER klauzulemi a ORDER BY klauzulemi.

Použití OVER a ORDER BY klauzule Deterministický
Ne Ano
Ano Ne

Další informace naleznete v tématu Deterministické a nedeterministické funkce.

ARITHABORT a ANSI_WARNINGS

  • Pokud COUNT vrátí hodnotu, která překročí maximální hodnotu int (231–1 nebo 2 147 483 647), funkce selže kvůli celočíselnému přetečení.

  • Pokud COUNT přetečení a oběARITHABORT možnosti ANSI_WARNINGS jsou OFF, COUNT vrátí .NULL V opačném případě dotazARITHABORT přeruší nebo ANSI_WARNINGSONpřeruší a vyvolá chybu aritmetické přetečení:

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

    Pokud chcete tyto velké výsledky správně zpracovat, použijte místo toho COUNT_BIG , což vrací bigint.

  • V obou ARITHABORT případech ANSI_WARNINGSONmůžete bezpečně zabalit COUNT weby ISNULL( <count-expr>, 0) volání, aby bylo možné převést typ výrazu na hodnotu NOT NULL místo hodnoty INT NULL. ISNULL Zabalení COUNT znamená, že jakákoli chyba přetečení je bezobslužně potlačena, což by mělo být považováno za správnost.

Příklady

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

A. Použití funkce COUNT a DISTINCT

Tento příklad vrátí počet různých pracovních pozic v HumanResources.Employee tabulce, kterou může zaměstnanec uchovávat.

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

Tady je soubor výsledků.

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

B. Použití FUNKCE COUNT(*)

Tento příklad vrátí celkový počet zaměstnanců v HumanResources.Employee tabulce.

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

Tady je soubor výsledků.

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

C. Použití funkce COUNT(*) s jinými agregacemi

Tento příklad ukazuje, že COUNT(*) funguje s dalšími agregačními funkcemi v SELECT seznamu.

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

Tady je soubor výsledků.

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

D. Použití klauzule OVER

Tento příklad používá funkce MIN, a AVGMAXCOUNT funkce s OVER klauzulí k vrácení agregovaných hodnot pro každé oddělení v HumanResources.Department tabulce.

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;

Tady je soubor výsledků.

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

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

E. Použití funkce COUNT a DISTINCT

Tento příklad vrátí počet různých titulů, které může mít zaměstnanec konkrétní společnosti.

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

Tady je soubor výsledků.

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

F. Použití FUNKCE COUNT(*)

Tento příklad vrátí celkový počet řádků v dbo.DimEmployee tabulce.

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

Tady je soubor výsledků.

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

G. Použití funkce COUNT(*) s jinými agregacemi

Tento příklad kombinuje COUNT(*) s dalšími agregačními funkcemi SELECT v seznamu. Vrátí počet zástupců prodeje s roční kvótou prodeje větší než 500 000 USD a průměrnou prodejní kvótou těchto zástupců prodeje.

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

Tady je soubor výsledků.

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

H. Použití funkce COUNT s VYUŽITÍM FUNKCE HAVING

Tento příklad používá COUNT s HAVING klauzulí k vrácení oddělení společnosti, z nichž každý má více než 15 zaměstnanců.

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

Tady je soubor výsledků.

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

Já. Použití funkce COUNT s over

Tento příklad používá COUNT s OVER klauzulí k vrácení počtu produktů obsažených v každé zadané prodejní objednávce.

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

Tady je soubor výsledků.

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