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 nenulových hodnot.

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í funkce 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ášť. To zahrnuje řádky, které obsahují hodnoty null.

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 části OVER – klauzule (Transact-SQL).

Návratové typy

  • int NOT NULL pokud ANSI_WARNINGS je ONvšak SQL Server bude vždy považovat COUNT výrazy jako int NULL v metadatech, pokud není zabaleno ISNULL.

  • int NULL , pokud ANSI_WARNINGS je OFF.

Poznámky

  • COUNT(*) bez GROUP BY vrácení kardinality (počet řádků) v sadě výsledků. To zahrnuje řádky, které se skládají z hodnot all aNULL duplicit.
  • COUNT(*) vrátí GROUP BY počet řádků v každé skupině. To zahrnuje NULL hodnoty a duplicity.
  • COUNT(ALL <expression>) vyhodnotí výraz pro každý řádek ve skupině a vrátí počet nenulových hodnot.
  • COUNT(DISTINCT <expression>) vyhodnotí výraz pro každý řádek ve skupině a vrátí počet jedinečných nenulových hodnot.

COUNT je deterministická funkce při použití bez klauzulí OVER a ORDER BY. Při použití s klauzulí OVER a ORDER BY je nedeterministické. Další informace naleznete v tématu Deterministické a nedeterministické funkce.

ARITHABORT a ANSI_WARNINGS

Pokud COUNT má vrácenou hodnotu překračující maximální hodnotu int (tj. 231–1 nebo 2 147 483 647), COUNT funkce selže kvůli celočíselnému přetečení. Při COUNT přetečení a oběARITHABORT možnosti ANSI_WARNINGS jsou OFF, COUNT vrátí .NULL V opačném případě se ARITHABORTANSI_WARNINGSONdotaz přeruší a vyvolá se chyba Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int. aritmetické přetečení. Chcete-li tyto velké výsledky správně zpracovat, použijte COUNT_BIG místo toho, abyste vrátili bigint.

Pokud jsou oba ARITHABORT a ANSI_WARNINGS jsou ON, můžete bezpečně zabalit COUNT call-sites do ISNULL( <count-expr>, 0 ) , aby se typ int NOT NULL výrazu místo int NULL. COUNT Zabalení ISNULL znamená, že jakákoli chyba přetečení bude bezobslužně potlačena, což by mělo být považováno za správnost.

Příklady

A. Použití funkce COUNT a DISTINCT

Tento příklad vrátí počet různých titulů, které může zaměstnanec Adventure Works Cycles uchovávat.

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

Tady je soubor výsledků.

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

B. Použití FUNKCE COUNT(*)

Tento příklad vrátí celkový počet zaměstnanců Adventure Works Cycles.

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

Tady je soubor výsledků.

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

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. Příklad využívá databázi AdventureWorks2025.

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

Tady je soubor výsledků.

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

D. Použití klauzule OVER

Tento příklad používá , , a COUNT funkce s klauzulí OVER , které vracejí agregované hodnoty pro každé oddělení v databázové tabulce AdventureWorks2025HumanResources.Department. AVGMAXMIN

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;

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

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

Viz také