Partilhar via


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

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

Confira também