Compartir a través de


CONTEO (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de SQL Analytics en Microsoft FabricAlmacén en Microsoft FabricBase de datos SQL 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 función de agregación:

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

Sintaxis de función analítica:

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

Argumentos

TODOS

Aplica la función de agregado a todos los valores. ALL actúa como valor predeterminado.

DISTINTO

Especifica que COUNT devuelve el número de valores no NULL únicos.

expresión

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 parámetros y no 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, incluidas las filas que contienen valores de tipo null.

CAMBIO ( [ 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.

Tipos de valores devueltos

  • Devuelve int NOT NULL cuando ANSI_WARNINGS es ON. Sin embargo, SQL Server siempre trata las COUNT expresiones como int NULL en los metadatos, a menos que se encapsulan en ISNULL.

  • Devuelve int NULL cuando ANSI_WARNINGS es OFF.

Comentarios

COUNT(*) sin GROUP BY devuelve la cardinalidad (número de filas) del conjunto de resultados. Este recuento incluye filas que tienen todos los NULL valores y duplicados.

COUNT(*) con GROUP BY devuelve el número de filas de cada grupo. Este recuento incluye NULL valores y duplicados.

COUNT(ALL <expression>) evalúa la expresión para cada fila de un grupo y devuelve el número de valores no NULL.

COUNT(DISTINCT <expression>) evalúa la expresión para cada fila de un grupo y devuelve el número de valores únicos y no NULL.

Uso determinista y no determinista

COUNT_BIG es una función determinista cuando se usa sin las OVER cláusulas y ORDER BY .

COUNT_BIG no es determinista cuando se usa con las OVER cláusulas y ORDER BY .

Usos OVER y ORDER BY cláusulas Determinista
No
No

Para más información, vea Funciones deterministas y no deterministas.

ARITHABORT y ANSI_WARNINGS

  • Cuando COUNT devuelve un valor que supera el valor máximo de int (231-1 o 2.147.483.647), se produce un error en la función debido a un desbordamiento entero.

  • Si COUNT los desbordamientos y lasARITHABORT opciones y ANSI_WARNINGS son OFF, COUNT devuelve NULL. De lo contrario, si oARITHABORTANSI_WARNINGS es ON, la consulta anula y genera el error de desbordamiento aritmético:

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

    Para controlar correctamente estos resultados grandes, use COUNT_BIG en su lugar, que devuelve bigint.

  • Cuando y ARITHABORTANSI_WARNINGS son ON, puede encapsular COUNT de forma segura los sitios de llamada en para convertir el tipo de la expresión en ISNULL( <count-expr>, 0)int NOT NULL en lugar de int NULL. Ajustar en ISNULL significa que cualquier error de desbordamiento COUNT se suprime silenciosamente, que se debe considerar para la corrección.

Ejemplos

Los ejemplos de código de este artículo usan la base de datos de ejemplo de AdventureWorks2025 o AdventureWorksDW2025, que puede descargar de la página principal de Ejemplos de Microsoft SQL Server y proyectos de comunidad.

Un. Usar COUNT y DISTINCT

En este ejemplo se devuelve el número de puestos de trabajo diferentes de la HumanResources.Employee tabla que un empleado puede contener.

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

Este es el conjunto de resultados.

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

B. Usar COUNT(*)

En este ejemplo se devuelve el número total de empleados de la HumanResources.Employee tabla.

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

Este es el conjunto de resultados.

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

C. Usar COUNT(*) con otros agregados

En este ejemplo se muestra que COUNT(*) funciona con otras funciones agregadas en la lista SELECT.

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

Este es el conjunto de resultados.

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

D. Uso de la cláusula OVER

En este ejemplo se usan las MINfunciones , MAX, AVGy COUNT con la OVER cláusula para devolver valores agregados para cada departamento de la HumanResources.Department tabla.

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;

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

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

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