COUNT_BIG(Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics分析平台系统(PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库Microsoft Fabric 中的 SQL 数据库

此函数返回组中找到的项数量。 COUNT_BIG 的操作与 COUNT 函数类似。 这些函数区别只在于其返回的值的数据类型。 COUNT_BIG 始终返回“bigint”数据类型值。 COUNT 始终返回“int”数据类型值。

Transact-SQL 语法约定

语法

聚合函数语法:

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

分析函数语法:

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

参数

ALL

向所有值应用此聚合函数。 ALL 用作默认值。

DISTINCT

指定 COUNT_BIG 返回唯一非 null 值的数目。

expression

任何类型的表达式COUNT_BIG 不支持表达式中的聚合函数或子查询。

*

指定 COUNT_BIG 应对所有行计数,以确定要返回的总表行计数。 COUNT_BIG(*) 不采用任何参数,不支持使用 DISTINCTCOUNT_BIG(*) 不需要“expression”参数,因为根据定义,该函数不使用有关任何特定列的信息。 COUNT_BIG(*) 返回指定表中的行数,但保留副本行。 它会单独为每一行计数,包括包含 null 值的行。

OVER ([ partition_by_clause ] [ order_by_clause ] )

“partition_by_clause”FROM 子句生成的结果集划分为要应用 COUNT_BIG 函数的分区。 如果未指定 partition_by_clause,该函数会将查询结果集的所有行视为单个组。 “order_by_clause”确定操作的逻辑顺序。 有关详细信息,请参阅 OVER 子句

返回类型

bigint

备注

COUNT_BIG(*) 返回组中的项数。 此计数包括 NULL 值和重复项。

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

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

确定性和非确定性用法

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

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

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

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

示例

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

答: 使用 COUNT_BIG 和 DISTINCT

本示例返回员工可以持有的 HumanResources.Employee 表中不同职务的数目。

SELECT COUNT_BIG(DISTINCT JobTitle)
FROM HumanResources.Employee;
GO

结果集如下。

-----------
67

B. 使用 COUNT_BIG\

此示例返回表中的员工 HumanResources.Employee 总数。

SELECT COUNT_BIG(*)
FROM HumanResources.Employee;
GO

结果集如下。

-----------
290

C. 将 COUNT_BIG\ 与其他聚合配合使用

此示例演示 COUNT_BIG(*)SELECT 列表中的其他聚合函数配合使用。

SELECT COUNT_BIG(*), AVG(Bonus)
FROM Sales.SalesPerson
WHERE SalesQuota > 25000;
GO

结果集如下。

------ ---------------------
14     3472.1428

D. 使用 OVER 子句

此示例使用包含子句的MIN函数 MAXCOUNT_BIGAVG来返回表中每个部门的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_BIG(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_BIG 和 DISTINCT

此示例返回特定公司的员工可以保存的不同的标题数。

USE ssawPDW;
SELECT COUNT_BIG(DISTINCT Title)
FROM dbo.DimEmployee;

结果集如下。

-----------
67

F. 使用 COUNT_BIG\

此示例返回 dbo.DimEmployee 表中的总行数。

USE ssawPDW;
SELECT COUNT_BIG(*)
FROM dbo.DimEmployee;

结果集如下。

-------------
296

G. 将 COUNT_BIG\ 与其他聚合配合使用

此示例组合 COUNT_BIG(*)SELECT 列表中的其他聚合函数。 它返回年度销售配额大于 $500,000 的销售代表的人数和这些销售代表的平均销售配额。

USE ssawPDW;
SELECT COUNT_BIG(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_BIG与 HAVING 配合使用

此示例将 COUNT_BIGHAVING 子句配合使用以返回某家公司的部门,每个部门有超过 15 位员工。

USE ssawPDW;
SELECT DepartmentName,
       COUNT_BIG(EmployeeKey) AS EmployeesInDept
FROM dbo.DimEmployee
GROUP BY DepartmentName
HAVING COUNT_BIG(EmployeeKey) > 15;

结果集如下。

DepartmentName  EmployeesInDept
--------------  ---------------
Sales           18
Production      179

I. 将COUNT_BIG与 OVER 配合使用

此示例将 COUNT_BIGOVER 子句配合使用,返回指定的每个销售订单中包含的产品数。

USE ssawPDW;
SELECT DISTINCT COUNT_BIG(ProductKey) OVER (PARTITION BY SalesOrderNumber) AS ProductCount,
                SalesOrderNumber
FROM dbo.FactInternetSales
WHERE SalesOrderNumber IN (N'SO53115', N'SO55981');

结果集如下。

ProductCount   SalesOrderID
------------   -----------------
3              SO53115
1              SO55981