COUNT (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲
此函數會傳回群組中找到的項目數。 COUNT
的運作方式類似 COUNT_BIG 函數。 這些函數唯一的差別就是其傳回值的資料類型。 COUNT
一律會傳回 int 資料類型值。 COUNT_BIG
一律會傳回 bigint 資料類型值。
Syntax
彙總函數語法
COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )
分析函數語法
COUNT ( [ ALL ] { expression | * } ) OVER ( [ <partition_by_clause> ] )
引數
ALL
將彙總函式套用至所有值。 全部都可以當作預設值。
DISTINCT
指定 COUNT
傳回唯一非 Null 值的數目。
expression
為任何類型的運算式 (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 子句 (Transact-SQL) 以取得詳細資訊。
傳回類型
當
ANSI_WARNINGS
為ON
時,傳回 int NOT NULL,但除非包裝在ISNULL
中,否則 SQL Server 一律會在中繼資料中將COUNT
運算式視為int NULL
。當
ANSI_WARNINGS
為OFF
時,傳回 int NULL。
備註
- 未搭配
GROUP BY
的COUNT(*)
在結果集中傳回基數 (資料列數目)。 其中包括由所有NULL
值和重複項組成的資料列。 - 搭配
GROUP BY
的COUNT(*)
傳回每個群組中的資料列數目。 其中包括NULL
值和重複項。 COUNT(ALL <expression>)
會針對群組中的每個資料列來評估 expression,並傳回非 Null 值的數目。COUNT(DISTINCT *expression*)
會針對群組中的每個資料列來評估 expression,並傳回唯一非 Null 值的數目。
未搭配 OVER 和 ORDER BY 子句使用時,COUNT
是具決定性函數。 搭配 OVER 和 ORDER BY 子句時,則不具決定性。 如需詳細資訊,請參閱決定性與非決定性函數。
ARITHABORT
和 ANSI_WARNINGS
如果 COUNT
的傳回值超過 int 的最大值 (即 231-1 或 2,147,483,647),則 COUNT
函數將會因為整數溢位而失敗。 當 COUNT
溢位且 ARITHABORT
和 ANSI_WARNINGS
選項「都」是 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。
當 ARITHABORT
和 ANSI_WARNINGS
都是 ON
時,您可以將 COUNT
呼叫位置安全地包裝在 ISNULL( <count-expr>, 0 )
中,以將運算式的類型強制轉換成 int NOT NULL
而不是 int NULL
。 將 COUNT
包裝在 ISNULL
中表示任何溢位錯誤都會以無訊息方式隱藏,應為了正確性考慮此問題。
範例
A. 使用 COUNT 與 DISTINCT
此範例會傳回 Adventure Works Cycles 員工可能擁有的不同職稱數。
SELECT COUNT(DISTINCT Title)
FROM HumanResources.Employee;
GO
結果集如下所示。
-----------
67
(1 row(s) affected)
B. 使用 COUNT(*)
此範例會傳回 Adventure Works Cycles 員工總數。
SELECT COUNT(*)
FROM HumanResources.Employee;
GO
結果集如下所示。
-----------
290
(1 row(s) affected)
C. 搭配其他彙總使用 COUNT(*)
此範例會說明 COUNT(*)
如何搭配 SELECT
清單中的其他彙總函數使用。 此範例使用 AdventureWorks2022 資料庫。
SELECT COUNT(*), AVG(Bonus)
FROM Sales.SalesPerson
WHERE SalesQuota > 25000;
GO
結果集如下所示。
----------- ---------------------
14 3472.1428
(1 row(s) affected)
D. 使用 OVER 子句
這個範例會MIN
使用 、 MAX
AVG
和 COUNT
函式搭配 OVER
子句,傳回 AdventureWorks2022 資料庫HumanResources.Department
數據表中每個部門的匯總值。
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;
結果集如下所示。
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)
範例: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
I. 搭配 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