適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Azure Synapse Analytics
分析平台系統(PDW)
Microsoft Fabric 中的 SQL 分析端點
Microsoft Fabric 中的倉儲
Microsoft Fabric 中的 SQL 資料庫
此函數會傳回群組中找到的項目數。
COUNT 的運作方式類似 COUNT_BIG 函數。 這些函數唯一的差別就是其傳回值的資料類型。
COUNT 一律會傳回 int 資料類型值。
COUNT_BIG 一律會傳回 bigint 資料類型值。
語法
聚合函數語法:
COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )
解析函數語法:
COUNT ( { [ ALL ] expression | * } ) OVER ( [ <partition_by_clause> ] )
引數
全部
將彙總函式套用至所有值。
ALL 作為預設值。
獨特的
指定回 COUNT 傳唯一非空值的數量。
表示式
為任何類型的運算式 (image、ntext 或 text 除外)。
COUNT 不支援運算式中的彙總函數或子查詢。
*
指定 COUNT 應該計算所有資料列,以判斷要傳回的總資料表資料列計數。
COUNT(*) 不取參數,且不支援使用 DISTINCT。
COUNT(*) 不需要 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 NULL 。ANSI_WARNINGS然而,SQL Server 在元資料中總是將COUNT表達式視為 整數 NULL ,除非在 中包裝ISNULL。當
ANSI_WARNINGS為OFF時,回傳整數 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時,則是非確定性的。
用途 OVER 與 ORDER BY 條款 |
具決定性 |
|---|---|
| 否 | Yes |
| Yes | 否 |
如需詳細資訊,請參閱決定性與非決定性函數。
阿里薩博特與ANSI_WARNINGS
當
COUNT回傳的值超過整 數 的最大值(231-1 或 2,147,483,647)時,函數因整數溢位而失敗。若
COUNT溢出且 與ANSI_WARNINGS選項皆ARITHABORT為OFF,COUNT則返回NULL。 否則,若 其中ARITHABORT或ANSI_WARNINGS為ON,查詢將中止並產生算術溢位錯誤:Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int.要正確處理這些大結果,請改用 COUNT_BIG ,回傳 bigint。
當 和
ANSI_WARNINGS都ARITHABORT為ON時,你可以安全地將呼叫站點 包覆COUNT在 ,ISNULL( <count-expr>, 0)強制表達式的型別變成整數 NOT NULL,而非整數 NULL。 包裹(wrappingCOUNTinISNULL)表示任何溢位錯誤都會被無聲地抑制,這點應該被考量為正確性。
範例
本文中的程式代碼範例會使用 AdventureWorks2025 或 AdventureWorksDW2025 範例資料庫,您可以從 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、 、 AVG及COUNT函數,並搭配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
此範例會使用 COUNT 與 HAVING 子句,以便傳回公司中員工數超過 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
此範例使用 COUNT 與 OVER 子句,以便傳回每個指定銷售訂單中包含的產品數目。
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