COUNT (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse Analytics分析平台系統(PDW)Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲Microsoft Fabric 中的 SQL 資料庫

此函數會傳回群組中找到的項目數。 COUNT 的運作方式類似 COUNT_BIG 函數。 這些函數唯一的差別就是其傳回值的資料類型。 COUNT 一律會傳回 int 資料類型值。 COUNT_BIG 一律會傳回 bigint 資料類型值。

Transact-SQL 語法慣例

語法

聚合函數語法:

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

解析函數語法:

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

引數

全部

將彙總函式套用至所有值。 ALL 作為預設值。

獨特的

指定回 COUNT 傳唯一非空值的數量。

表示式

為任何類型的運算式 (imagentexttext 除外)。 COUNT 不支援運算式中的彙總函數或子查詢。

*

指定 COUNT 應該計算所有資料列,以判斷要傳回的總資料表資料列計數。 COUNT(*) 不取參數,且不支援使用 DISTINCTCOUNT(*) 不需要 expression 參數,因為依照定義,該函數不會使用任何特定資料行的相關資訊。 COUNT(*) 會傳回指定資料表的資料列數,而且它會保留重複的資料列。 會分開計算每個資料列,包括含有 null 值的資料列。

OVER ( [ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ] )

partition_by_clause 會將 FROM 子句產生的結果集,分割成 COUNT 函數所要套用的資料分割。 如未指定,此函數會將查詢結果集的所有資料列視為單一群組。 order_by_clause 會決定作業的邏輯順序。 欲了解更多資訊,請參閱 OVER 條款

傳回類型

  • 當 是 ON時,回傳 int NOT NULLANSI_WARNINGS 然而,SQL Server 在元資料中總是將 COUNT 表達式視為 整數 NULL ,除非在 中包裝 ISNULL

  • ANSI_WARNINGSOFF時,回傳整數 NULL

備註

COUNT(*) 若無, GROUP BY 則返回結果集中的基數(列數)。 此計數包含所有 NULL 值與重複值的列。

搭配 COUNT(*)GROUP BY 傳回每個群組中的資料列數目。 此計數包含 NULL 價值與重複。

COUNT(ALL <expression>) 對群組中的每一列計算 ,並回傳非空值的數量。

COUNT(DISTINCT <expression>) 對群組中的每一列計算 ,並回傳唯一且非空值的數量。

確定性與非確定性用法

COUNT_BIG使用 OVER and ORDER BY 子句時,是一個確定性函數。

COUNT_BIG當與 和 ORDER BY 子句一起使用OVER時,則是非確定性的

用途 OVERORDER BY 條款 具決定性
Yes
Yes

如需詳細資訊,請參閱決定性與非決定性函數

阿里薩博特與ANSI_WARNINGS

  • COUNT 回傳的值超過整 的最大值(231-1 或 2,147,483,647)時,函數因整數溢位而失敗。

  • COUNT溢出且 與 ANSI_WARNINGS 選項ARITHABORTOFFCOUNT則返回 NULL。 否則,若 其中ARITHABORTANSI_WARNINGSON,查詢將中止並產生算術溢位錯誤:

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

    要正確處理這些大結果,請改用 COUNT_BIG ,回傳 bigint

  • 當 和 ANSI_WARNINGSARITHABORTON時,你可以安全地將呼叫站點 包覆COUNT在 ,ISNULL( <count-expr>, 0)強制表達式的型別變成整數 NOT NULL,而非整數 NULL。 包裹(wrapping COUNT in ISNULL )表示任何溢位錯誤都會被無聲地抑制,這點應該被考量為正確性。

範例

本文中的程式代碼範例會使用 AdventureWorks2025AdventureWorksDW2025 範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案 首頁下載。

A。 使用 COUNT 與 DISTINCT

此範例回傳員工可擔任的表格中 HumanResources.Employee 不同職稱數量。

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

結果集如下所示。

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

B. 使用 COUNT(*)

此範例會回傳表格中 HumanResources.Employee 員工總數。

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

結果集如下所示。

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

C. 搭配其他彙總使用 COUNT(*)

此範例會說明 COUNT(*) 如何搭配 SELECT 清單中的其他彙總函數使用。

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

結果集如下所示。

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

D. 使用 OVER 子句

此範例使用MINMAX、 、 AVGCOUNT函數,並搭配OVER子句回傳表格中HumanResources.Department每個部門的彙總值。

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;

結果集如下所示。

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

範例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

E. 使用 COUNT 與 DISTINCT

此範例會傳回特定公司某一員工可能擁有的不同職稱數。

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

結果集如下所示。

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

F. 使用 COUNT(*)

此範例會傳回 dbo.DimEmployee 資料表中的資料列總數。

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

結果集如下所示。

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

G. 搭配其他彙總使用 COUNT(*)

此範例會將 COUNT(*)SELECT 清單中的其他彙總函數結合。 它會傳回年銷售配額大於美金 $500,000 元的銷售代表數目,以及這些銷售代表的平均銷售配額。

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

結果集如下所示。

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

H. 搭配 HAVING 使用 COUNT

此範例會使用 COUNTHAVING 子句,以便傳回公司中員工數超過 15 人的各部門。

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

結果集如下所示。

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

一. 搭配 OVER 使用 COUNT

此範例使用 COUNTOVER 子句,以便傳回每個指定銷售訂單中包含的產品數目。

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

結果集如下所示。

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