分享方式:


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 資料類型值。

Transact-SQL 語法慣例

Syntax

彙總函數語法

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

分析函數語法

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

引數

ALL

將彙總函式套用至所有值。 全部都可以當作預設值。

DISTINCT

指定 COUNT 傳回唯一非 Null 值的數目。

expression

為任何類型的運算式 (imagentexttext 除外)。 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_WARNINGSON 時,傳回 int NOT NULL,但除非包裝在 ISNULL 中,否則 SQL Server 一律會在中繼資料中將 COUNT 運算式視為 int NULL

  • ANSI_WARNINGSOFF 時,傳回 int NULL

備註

  • 未搭配 GROUP BYCOUNT(*) 在結果集中傳回基數 (資料列數目)。 其中包括由所有 NULL 值和重複項組成的資料列。
  • 搭配 GROUP BYCOUNT(*) 傳回每個群組中的資料列數目。 其中包括 NULL 值和重複項。
  • COUNT(ALL <expression>) 會針對群組中的每個資料列來評估 expression,並傳回非 Null 值的數目。
  • COUNT(DISTINCT *expression*) 會針對群組中的每個資料列來評估 expression,並傳回唯一非 Null 值的數目。

未搭配 OVER 和 ORDER BY 子句使用時,COUNT 是具決定性函數。 搭配 OVER 和 ORDER BY 子句時,則不具決定性。 如需詳細資訊,請參閱決定性與非決定性函數

ARITHABORTANSI_WARNINGS

如果 COUNT 的傳回值超過 int 的最大值 (即 231-1 或 2,147,483,647),則 COUNT 函數將會因為整數溢位而失敗。 當 COUNT 溢位且 ARITHABORTANSI_WARNINGS 選項「都」是 OFF 時,COUNT 將傳回 NULL。 否則,當 ARITHABORTANSI_WARNINGS「任一項」為 ON 時,查詢將會中止,並引發算術溢位錯誤 Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int.。 若要正確處理這些大型結果,請改用 COUNT_BIG,這會傳回 bigint

ARITHABORTANSI_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使用 、 MAXAVGCOUNT 函式搭配 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

此範例會使用 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

I. 搭配 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

另請參閱