COUNT (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Punto de conexión de análisis SQL en Microsoft Fabric Almacenamiento en Microsoft Fabric
Esta función devuelve el número de elementos encontrados en un grupo. COUNT
funciona como la función COUNT_BIG. Estas funciones difieren solo en los tipos de datos de sus valores devueltos. COUNT
siempre devuelve un valor de tipo de datos int. COUNT_BIG
siempre devuelve un valor de tipo de datos bigint.
Convenciones de sintaxis de Transact-SQL
Sintaxis
Sintaxis de funciones de agregación
COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )
Sintaxis de funciones analíticas
COUNT ( [ ALL ] { expression | * } ) OVER ( [ <partition_by_clause> ] )
Argumentos
ALL
Aplica la función de agregado a todos los valores. ALL sirve como valor predeterminado.
DISTINCT
Especifica que COUNT
devuelva el número de valores únicos no NULL.
expression
Es una expresión de cualquier tipo excepto image, ntext o text. COUNT
no admite funciones de agregado ni subconsultas en una expresión.
*
Especifica que COUNT
debe contar todas las filas para determinar el total de filas de la tabla a devolver. COUNT(*)
no toma ningún parámetro ni admite el uso de DISTINCT. COUNT(*)
no requiere un parámetro expression porque, por definición, no usa información sobre ninguna columna concreta. COUNT(*)
devuelve el número de filas de una tabla especificada y conserva las filas duplicadas. Cuenta cada fila por separado. Esto incluye las filas que contienen valores NULL.
OVER ( [ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ] )
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM
en particiones a las que se aplica la función COUNT
. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como un único grupo. order_by_clause determina el orden lógico de la operación. Para obtener más información, consulte Cláusula OVER (Transact-SQL).
Tipos de valores devueltos
int NOT NULL cuando
ANSI_WARNINGS
esON
, pero SQL Server siempre tratará las expresionesCOUNT
comoint NULL
en los metadatos, a menos que se encapsulen enISNULL
.int NULL cuando
ANSI_WARNINGS
esOFF
.
Comentarios
COUNT(*)
sinGROUP BY
devuelve la cardinalidad (número de filas) en el conjunto de resultados. Esto incluye filas formadas por valores todosNULL
y duplicados.COUNT(*)
conGROUP BY
devuelve el número de filas de cada grupo. Incluye los valoresNULL
y los duplicados.COUNT(ALL <expression>)
evalúa expression en cada fila de un grupo y devuelve el número de valores no NULL.COUNT(DISTINCT *expression*)
evalúa expression en cada fila de un grupo y devuelve el número de valores únicos no NULL.
COUNT
es una función determinista cuando se utiliza sin las cláusulas OVER y ORDER BY. Es no determinista cuando se usa con las cláusulas OVER y ORDER BY. Para más información, vea Funciones deterministas y no deterministas.
ARITHABORT
y ANSI_WARNINGS
Cuando COUNT
tiene un valor devuelto que supera el valor máximo de int (es decir, 231-1 o 2.147.483.647), se producirá un error en la función COUNT
debido a un desbordamiento de enteros. Cuando COUNT
se desborda y las dos opciones ARITHABORT
y ANSI_WARNINGS
son OFF
, COUNT
devolverá NULL
. De lo contrario, cuando cualquiera de las opciones ARITHABORT
o ANSI_WARNINGS
es ON
, la consulta se anulará y se generará el error Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int.
de desbordamiento aritmético. Para controlar correctamente estos resultados grandes, use COUNT_BIG
en su lugar, que devuelve bigint.
Cuando tanto ARITHABORT
como ANSI_WARNINGS
son ON
, puede encapsular los sitios de llamada COUNT
en ISNULL( <count-expr>, 0 )
para convertir el tipo de expresión en int NOT NULL
en lugar de en int NULL
. El ajuste de COUNT
en ISNULL
significa que cualquier error de desbordamiento se suprimirá de forma silenciosa, algo que se debe tener en cuenta para la exactitud.
Ejemplos
A. Usar COUNT y DISTINCT
Este ejemplo se muestra el número de diferentes cargos que puede tener un empleado de Adventure Works Cycles.
SELECT COUNT(DISTINCT Title)
FROM HumanResources.Employee;
GO
Este es el conjunto de resultados.
-----------
67
(1 row(s) affected)
B. Usar COUNT(*)
Este ejemplo devuelve el número total de empleados de Adventure Works Cycles.
SELECT COUNT(*)
FROM HumanResources.Employee;
GO
Este es el conjunto de resultados.
-----------
290
(1 row(s) affected)
C. Usar COUNT(*) con otros agregados
En este ejemplo se muestra que COUNT(*)
funciona con otras funciones agregadas en la lista SELECT
. En el ejemplo se usa la base de datos AdventureWorks2022.
SELECT COUNT(*), AVG(Bonus)
FROM Sales.SalesPerson
WHERE SalesQuota > 25000;
GO
Este es el conjunto de resultados.
----------- ---------------------
14 3472.1428
(1 row(s) affected)
D. Uso de la cláusula OVER
En este ejemplo se usan las funciones MIN
, MAX
, AVG
y COUNT
con la cláusula OVER
a fin de devolver valores agregados para cada departamento en la tabla HumanResources.Department
de la base de datos AdventureWorks2022.
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;
Este es el conjunto de resultados.
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)
Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)
E. Usar COUNT y DISTINCT
Este ejemplo se muestra el número de diferentes cargos que puede tener un empleado de una empresa concreta.
USE ssawPDW;
SELECT COUNT(DISTINCT Title)
FROM dbo.DimEmployee;
Este es el conjunto de resultados.
-----------
67
F. Usar COUNT(*)
Este ejemplo devuelve el número total de filas de la tabla dbo.DimEmployee
.
USE ssawPDW;
SELECT COUNT(*)
FROM dbo.DimEmployee;
Este es el conjunto de resultados.
-------------
296
G. Usar COUNT(*) con otros agregados
Este ejemplo combina COUNT(*)
con otras funciones de agregado en la lista SELECT
. Devuelve el número de los representantes de ventas con una cuota de ventas anual superior a 500 000 dólares y el promedio de cuota de ventas de dichos representantes.
USE ssawPDW;
SELECT COUNT(EmployeeKey) AS TotalCount, AVG(SalesAmountQuota) AS [Average Sales Quota]
FROM dbo.FactSalesQuota
WHERE SalesAmountQuota > 500000 AND CalendarYear = 2001;
Este es el conjunto de resultados.
TotalCount Average Sales Quota
---------- -------------------
10 683800.0000
H. Usar COUNT con HAVING
En este ejemplo se utiliza COUNT
con la cláusula HAVING
para devolver los departamentos de una compañía, cada uno de los cuales tiene más de 15 empleados.
USE ssawPDW;
SELECT DepartmentName,
COUNT(EmployeeKey)AS EmployeesInDept
FROM dbo.DimEmployee
GROUP BY DepartmentName
HAVING COUNT(EmployeeKey) > 15;
Este es el conjunto de resultados.
DepartmentName EmployeesInDept
-------------- ---------------
Sales 18
Production 179
I. Usar COUNT con OVER
Este ejemplo usa COUNT
con la cláusula OVER
para devolver el número de productos que figura en cada uno de los pedidos de ventas especificados.
USE ssawPDW;
SELECT DISTINCT COUNT(ProductKey) OVER(PARTITION BY SalesOrderNumber) AS ProductCount
, SalesOrderNumber
FROM dbo.FactInternetSales
WHERE SalesOrderNumber IN (N'SO53115',N'SO55981');
Este es el conjunto de resultados.
ProductCount SalesOrderID
------------ -----------------
3 SO53115
1 SO55981