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 返回唯一非 null 值的数目。

expression

任意类型(“image”、“ntext”或“text”除外)的表达式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 子句

返回类型

  • 返回 int NOT NULL (如果 ANSI_WARNINGSON)。 但是,除非包装在ISNULL元数据中,否则 SQL Server 始终将表达式视为 COUNTint NULL

  • 返回 int NULL (当 ANSI_WARNINGSOFF..

备注

COUNT(*)GROUP BY 返回结果集中基数(行数)。 此计数包括具有所有 NULL 值和重复项的行。

COUNT(*)(带 GROUP BY)返回每组中的行数。 此计数包括 NULL 值和重复项。

COUNT(ALL <expression>) 计算组中每一行的 表达式 ,并返回非 null 值的数目。

COUNT(DISTINCT <expression>) 计算组中每一行的 表达式 ,并返回唯一的非 null 值数。

确定性和非确定性用法

COUNT_BIG不使用 andOVERORDER BY 子句的情况下使用时,是确定性函数。

COUNT_BIG与 and ORDER BY 子句一起使用OVER时是不确定的。

使用 OVERORDER BY 子句 具有确定性
是的
是的

有关详细信息,请参阅确定性函数和不确定性函数

ARITHABORT 和 ANSI_WARNINGS

  • COUNT 返回的值超过 int (231-1 或 2,147,483,647),函数因整数溢出而失败。

  • 如果COUNT溢出并且同时ARITHABORT存在OFFANSI_WARNINGS选项,COUNT则返回 NULL。 否则,如果 任一ARITHABORTANSI_WARNINGSON,则查询中止并引发算术溢出错误:

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

    若要正确处理这些大型结果,请改用 COUNT_BIG ,这将返回 bigint

  • 如果同时存在两ARITHABORT者,ANSI_WARNINGSON则可以安全地包装COUNT调用站点ISNULL( <count-expr>, 0),以强制表达式的类型为 int NOT NULL,而不是 int NULLCOUNT ISNULL换行意味着任何溢出错误都会以无提示方式禁止显示,这应该被视为正确性。

示例

本文中的代码示例使用 AdventureWorks2025AdventureWorksDW2025 示例数据库,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。

答: 使用 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 子句

此示例使用包含子句的MIN函数 MAXCOUNTAVG来返回表中每个部门的HumanResources.Department聚合值。OVER

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. 将 COUNT 与 HAVING 配合使用

此示例将 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

一。 将 COUNT 与 OVER 配合使用

此示例将 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