Compartilhar via


CONTAGEM (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)Ponto de extremidade de análise de SQL no Microsoft FabricDepósito no Microsoft FabricBanco de dados SQL 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 de função analítica:

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

Argumentos

TODOS

Aplica a função de agregação a todos os valores. ALL serve 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 parâmetros e não dá 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, inclusive as linhas que contêm valores nulos.

CÂMBIO ( [ 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. Para obter mais informações, consulte a cláusula OVER.

Tipos de retorno

  • Retorna int NOT NULL quando ANSI_WARNINGS é ON. No entanto, o SQL Server sempre trata COUNT expressões como null int em metadados, a menos que seja encapsulado ISNULL.

  • Retorna int NULL quando ANSI_WARNINGS é OFF.

Comentários

COUNT(*) sem GROUP BY retornar a cardinalidade (número de linhas) no conjunto de resultados. Essa contagem inclui linhas que têm todos os NULL valores e duplicatas.

COUNT(*) com GROUP BY retorna o número de linhas em cada grupo. Essa contagem inclui NULL valores e duplicatas.

COUNT(ALL <expression>) avalia a expressão para cada linha em um grupo e retorna o número de valores não nulos.

COUNT(DISTINCT <expression>) avalia a expressão para cada linha em um grupo e retorna o número de valores exclusivos e não nulos.

Uso determinístico e não determinístico

COUNT_BIG é uma função determinística quando usada sem as OVER cláusulas e ORDER BY .

COUNT_BIG não é determinístico quando usado com as OVER cláusulas e ORDER BY .

Usos OVER e ORDER BY cláusulas Determinística
Não Yes
Yes Não

Para obter mais informações, confira Funções determinísticas e não determinísticas.

ARITHABORT e ANSI_WARNINGS

  • Quando COUNT retorna um valor que excede o valor máximo de int (231-1 ou 2.147.483.647), a função falha devido a um estouro inteiro.

  • Se COUNT estouros e as opções e ANSI_WARNINGS as ARITHABORT opções foremOFF, COUNT retornará NULL. Caso contrário, se forARITHABORT ou ANSI_WARNINGS for ON, a consulta anulará e gerará o erro de estouro aritmético:

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

    Para lidar corretamente com esses resultados grandes, use COUNT_BIG em vez disso, o que retorna bigint.

  • Quando ambos ARITHABORT e ANSI_WARNINGS estão ON, você pode encapsular COUNT sites ISNULL( <count-expr>, 0) de chamada com segurança para coagir o tipo da expressão a int NOT NULL em vez de int NULL. ISNULL Encapsular COUNT significa que qualquer erro de estouro é suprimido silenciosamente, o que deve ser considerado para correção.

Exemplos

Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que você pode baixar na página inicial Microsoft SQL Server Samples and Community Projects.

a. Usar COUNT e DISTINCT

Este exemplo retorna o número de cargos diferentes na HumanResources.Employee tabela que um funcionário pode manter.

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

Veja a seguir o conjunto de resultados.

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

B. Usar COUNT (*)

Este exemplo retorna o número total de funcionários na HumanResources.Employee tabela.

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

Veja a seguir o conjunto de resultados.

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

C. Usar COUNT(*) com outras agregações

Este exemplo mostra que COUNT(*) funciona com outras funções de agregação na lista SELECT.

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

Veja a seguir o conjunto de resultados.

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

D. Usar a cláusula OVER

Este exemplo usa as MINfunções , MAXe AVGCOUNT funções com a OVER cláusula para retornar valores agregados para cada departamento na HumanResources.Department tabela.

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;

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

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

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