适用于: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 返回唯一非 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 子句。
返回类型
返回 int NOT NULL (如果
ANSI_WARNINGS为ON)。 但是,除非包装在ISNULL元数据中,否则 SQL Server 始终将表达式视为COUNTint NULL。返回 int NULL (当
ANSI_WARNINGS为OFF..
备注
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时是不确定的。
使用 OVER 和 ORDER BY 子句 |
具有确定性 |
|---|---|
| 否 | 是的 |
| 是的 | 否 |
有关详细信息,请参阅确定性函数和不确定性函数。
ARITHABORT 和 ANSI_WARNINGS
当
COUNT返回的值超过 int (231-1 或 2,147,483,647),函数因整数溢出而失败。如果
COUNT溢出并且同时ARITHABORT存在OFF和ANSI_WARNINGS选项,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_WARNINGSON则可以安全地包装COUNT调用站点ISNULL( <count-expr>, 0),以强制表达式的类型为 int NOT NULL,而不是 int NULL。COUNTISNULL换行意味着任何溢出错误都会以无提示方式禁止显示,这应该被视为正确性。
示例
本文中的代码示例使用 AdventureWorks2025 或 AdventureWorksDW2025 示例数据库,可以从 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 配合使用
此示例将 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
一。 将 COUNT 与 OVER 配合使用
此示例将 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