COUNT (Transact-SQL)

Se aplica a: SQL Server (todas las versiones admitidas) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

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> ] )

Nota

Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte Versiones anteriores de la documentación.

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 es ON, pero SQL Server siempre tratará las expresiones COUNT como int NULL en los metadatos, a menos que se encapsulen en ISNULL.

  • int NULL cuando ANSI_WARNINGS es OFF.

Comentarios

  • COUNT(*) sin GROUP BY devuelve la cardinalidad (número de filas) en el conjunto de resultados. Esto incluye filas formadas por valores todos NULL y duplicados.
  • COUNT(*) con GROUP BY devuelve el número de filas de cada grupo. Incluye los valores NULL 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

El conjunto de resultados es el siguiente:

-----------
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

El conjunto de resultados es el siguiente:

-----------
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 AdventureWorks2019.

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

El conjunto de resultados es el siguiente:

----------- ---------------------
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 AdventureWorks2019.

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;

El conjunto de resultados es el siguiente:

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;

El conjunto de resultados es el siguiente:

-----------
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;

El conjunto de resultados es el siguiente:

-------------
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;

El conjunto de resultados es el siguiente:

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;

El conjunto de resultados es el siguiente:

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');

El conjunto de resultados es el siguiente:

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

Consulte también