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 for ON, no entanto, o SQL Server sempre tratará expressões COUNT como int NULL nos metadados, a menos que seja encapsulada em ISNULL.

  • int NULL quando ANSI_WARNINGS for OFF.

Comentários

  • COUNT(*) sem GROUP BY retorna a cardinalidade (número de linhas) no conjunto de resultados. Isso inclui linhas compostas por todos os valores e duplicatas NULL.
  • COUNT(*) com GROUP BY retorna o número de linhas em cada grupo. Isso inclui valores e duplicatas NULL.
  • 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