COUNT (Transact-SQL)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise do SQL Warehouse no Microsoft Fabric
Essa função retorna o número de itens encontrados em um grupo. COUNT
funciona como a função COUNT_BIG. Essas funções são diferentes apenas nos tipos de dados de seus valores de retorno. COUNT
sempre retorna um valor do tipo de dados int. COUNT_BIG
sempre retorna um valor do tipo de dados bigint.
Convenções de sintaxe de Transact-SQL
Sintaxe
Sintaxe da função de agregação
COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )
Sintaxe da função analítica
COUNT ( [ ALL ] { expression | * } ) OVER ( [ <partition_by_clause> ] )
Argumentos
ALL
Aplica a função de agregação a todos os valores. ALL funciona como o padrão.
DISTINTO
Especifica que COUNT
retorna o número de valores não nulos exclusivos.
expressão
Uma expression de qualquer tipo, exceto image, ntext ou text. COUNT
não oferece suporte a funções de agregação ou subconsultas em uma expressão.
*
Especifica que COUNT
deve contar todas as linhas para determinar a contagem total de linhas da tabela para retornar. COUNT(*)
não usa nenhum parâmetro e não oferece suporte ao uso de DISTINCT. COUNT(*)
não exige um parâmetro expression porque, por definição, não usa informações sobre nenhuma coluna específica. COUNT(*)
retorna o número de linhas em uma tabela especificada e preserva linhas duplicatas. Ele conta cada linha separadamente. Isso inclui linhas que contêm valores nulos.
OVER ( [ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ] )
A partition_by_clause divide o conjunto de resultados produzido pela cláusula FROM
em partições às quais a função COUNT
é aplicada. Se não for especificado, a função tratará todas as linhas do conjunto de resultados da consulta como um único grupo. A order_by_clause determina a ordem lógica da operação. Confira Cláusula OVER (Transact-SQL) para obter mais informações.
Tipos de retorno
int NOT NULL quando
ANSI_WARNINGS
forON
, no entanto, o SQL Server sempre tratará expressõesCOUNT
comoint NULL
nos metadados, a menos que seja encapsulada emISNULL
.int NULL quando
ANSI_WARNINGS
forOFF
.
Comentários
COUNT(*)
semGROUP BY
retorna a cardinalidade (número de linhas) no conjunto de resultados. Isso inclui linhas compostas por todos os valores e duplicatasNULL
.COUNT(*)
comGROUP BY
retorna o número de linhas em cada grupo. Isso inclui valores e duplicatasNULL
.COUNT(ALL <expression>)
avalia a expressão de cada linha em um grupo e retorna o número de valores não nulos.COUNT(DISTINCT *expression*)
avalia a expressão de cada linha em um grupo e retorna o número de valores não nulos exclusivos.
COUNT
é uma função determinística quando usada sem as cláusulas OVER e ORDER BY. Ela é não determinística quando usada com as cláusulas OVER e ORDER BY. Para obter mais informações, confira Funções determinísticas e não determinísticas.
ARITHABORT
e ANSI_WARNINGS
Quando COUNT
tem um valor retornado que excede o valor máximo de int (ou seja, 231-1 ou 2.147.483.647), a função COUNT
falhará devido a um estouro de inteiro. Quando COUNT
estoura e as opções ARITHABORT
e ANSI_WARNINGS
são OFF
, COUNT
retornará NULL
. Caso contrário, quando um de ARITHABORT
ou ANSI_WARNINGS
for ON
, a consulta será anulada e o erro Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int.
de estouro aritmético será gerado. Para lidar corretamente com esses resultados grandes, use COUNT_BIG
em vez disso, que retorna bigint.
Quando ARITHABORT
e ANSI_WARNINGS
são ON
, você pode encapsular COUNT
com segurança em sites de chamada em ISNULL( <count-expr>, 0 )
para forçar o tipo da expressão para int NOT NULL
em vez de int NULL
. Encapsular COUNT
em ISNULL
significa que qualquer erro de estouro será suprimido silenciosamente, o que deve ser considerado para correção.
Exemplos
a. Usar COUNT e DISTINCT
Este exemplo retorna o número de cargos diferentes que um funcionário Ciclos da Adventure Works pode ter.
SELECT COUNT(DISTINCT Title)
FROM HumanResources.Employee;
GO
Veja a seguir o conjunto de resultados.
-----------
67
(1 row(s) affected)
B. Usar COUNT (*)
Este exemplo retorna o número total de funcionários Ciclos da Adventure Works.
SELECT COUNT(*)
FROM HumanResources.Employee;
GO
Veja a seguir o conjunto de resultados.
-----------
290
(1 row(s) affected)
C. Usar COUNT(*) com outras agregações
Este exemplo mostra que COUNT(*)
funciona com outras funções de agregação na lista SELECT
. O exemplo usa o banco de dados AdventureWorks2022.
SELECT COUNT(*), AVG(Bonus)
FROM Sales.SalesPerson
WHERE SalesQuota > 25000;
GO
Veja a seguir o conjunto de resultados.
----------- ---------------------
14 3472.1428
(1 row(s) affected)
D. Usar a cláusula OVER
Este exemplo usa as funções MIN
, MAX
, AVG
e COUNT
com a cláusula OVER
, para retornar valores agregados para cada departamento na tabela HumanResources.Department
do banco de dados 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;
Veja a seguir o 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)
Exemplos: Azure Synapse Analytics e PDW (Analytics Platform System)
E. Usar COUNT e DISTINCT
Este exemplo retorna o número de cargos diferentes que um funcionário de uma empresa específica pode ter.
USE ssawPDW;
SELECT COUNT(DISTINCT Title)
FROM dbo.DimEmployee;
Veja a seguir o conjunto de resultados.
-----------
67
F. Usar COUNT (*)
Este exemplo retorna o número total de linhas na tabela dbo.DimEmployee
.
USE ssawPDW;
SELECT COUNT(*)
FROM dbo.DimEmployee;
Veja a seguir o conjunto de resultados.
-------------
296
G. Usar COUNT(*) com outras agregações
Este exemplo combina COUNT(*)
com outras funções de agregação na lista SELECT
. Ele retorna o número de representantes de vendas com uma cota de vendas anual maior que US$ 500.000 e a cota de vendas média desses representantes de vendas.
USE ssawPDW;
SELECT COUNT(EmployeeKey) AS TotalCount, AVG(SalesAmountQuota) AS [Average Sales Quota]
FROM dbo.FactSalesQuota
WHERE SalesAmountQuota > 500000 AND CalendarYear = 2001;
Veja a seguir o conjunto de resultados.
TotalCount Average Sales Quota
---------- -------------------
10 683800.0000
H. Usar COUNT com HAVING
Este exemplo usa COUNT
com a cláusula HAVING
para retornar os departamentos de uma empresa, cada qual com mais de 15 funcionários.
USE ssawPDW;
SELECT DepartmentName,
COUNT(EmployeeKey)AS EmployeesInDept
FROM dbo.DimEmployee
GROUP BY DepartmentName
HAVING COUNT(EmployeeKey) > 15;
Veja a seguir o conjunto de resultados.
DepartmentName EmployeesInDept
-------------- ---------------
Sales 18
Production 179
I. Usar COUNT com OVER
Este exemplo a seguir usa COUNT
com a cláusula OVER
para retornar o número de produtos que estão contidos em cada uma das ordens de venda especificadas.
USE ssawPDW;
SELECT DISTINCT COUNT(ProductKey) OVER(PARTITION BY SalesOrderNumber) AS ProductCount
, SalesOrderNumber
FROM dbo.FactInternetSales
WHERE SalesOrderNumber IN (N'SO53115',N'SO55981');
Veja a seguir o conjunto de resultados.
ProductCount SalesOrderID
------------ -----------------
3 SO53115
1 SO55981