COUNT (Transact-SQL)
Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)Ponto de extremidade de SQL no Microsoft FabricWarehouse 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> ] )
Observação
Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.
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
Este é 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
Este é 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
Este é 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;
Este é 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;
Este é 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;
Este é 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;
Este é 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;
Este é 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');
Este é o conjunto de resultados.
ProductCount SalesOrderID
------------ -----------------
3 SO53115
1 SO55981
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de