다음을 통해 공유


COUNT(Transact-SQL)

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스

이 함수는 그룹에 있는 항목의 수를 반환합니다. COUNTCOUNT_BIG 함수처럼 작동합니다. 이러한 함수는 해당 반환 값의 데이터 형식만이 다릅니다. COUNT은 항상 int 데이터 형식 값을 반환합니다. COUNT_BIG은 항상 bigint 데이터 형식 값을 반환합니다.

Transact-SQL 구문 표기 규칙

Syntax

집계 함수 구문

COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )

분석 함수 구문

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

인수

ALL

모든 값에 집계 함수를 적용합니다. ALL은 기본값으로 사용됩니다.

DISTINCT

COUNT이 Null이 아닌 고유한 값의 수를 반환하도록 지정합니다.

expression

image, ntext 또는 text를 제외한 형식의 입니다. COUNT은 집계 함수 또는 하위 쿼리를 지원하지 않습니다.

*

COUNT이 반환할 총 테이블 행 개수를 결정하는 모든 행을 계산해야 한다고 지정합니다. COUNT(*)에는 매개 변수가 없으며 DISTINCT의 사용을 지원하지 않습니다. COUNT(*)은 특정 열에 대한 정보를 사용하지 않도록 정의되어 있으므로 expression 매개 변수가 필요하지 않습니다. COUNT(*)은 지정한 테이블에서 행의 수를 반환하고 중복 행을 유지합니다. 각 행은 개별적으로 계산되며 Null 값을 가진 행도 포함됩니다.

OVER ( [ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ] )

partition_by_clauseFROM 절이 생성한 결과 집합을 COUNT 함수가 적용되는 파티션으로 나눕니다. 지정하지 않을 경우 쿼리 결과 집합의 모든 행이 단일 그룹으로 취급됩니다. order_by_clause는 작업의 논리적 순서를 결정합니다. 자세한 내용은 OVER 절(Transact-SQL)을 참조하세요.

반환 형식

  • ANSI_WARNINGSON인 경우 int NOT NULL이지만 ISNULL에 의해 래핑되지 않는 한 SQL Server는 항상 COUNT 식을 메타데이터에서 int NULL로 처리합니다.

  • ANSI_WARNINGSOFF인 경우 int NULL입니다.

설명

  • GROUP BY 없는 COUNT(*)는 결과 집합의 카디널리티(행 수)를 반환합니다. 여기에는 all-NULL 값 및 중복으로 구성된 행이 포함됩니다.
  • GROUP BY가 있는 COUNT(*)은 각 그룹의 행 수를 반환합니다. 여기에는 NULL 값과 중복 항목이 포함됩니다.
  • COUNT(ALL <expression>)은 그룹에 포함된 각 행의 을 계산하여 Null이 아닌 값의 개수를 반환합니다.
  • COUNT(DISTINCT *expression*)은 그룹에 포함된 각 행의 을 계산하여 Null이 아닌 고유한 값의 개수를 반환합니다.

COUNT은 OVER 및 ORDER BY 절 없이 사용되는 경우 결정적 함수이고, OVER 및 ORDER BY 절과 함께 사용되는 경우 비결정 함수입니다. 자세한 내용은 결정적 함수와 비결정적 함수를 참조하세요.

ARITHABORTANSI_WARNINGS

COUNT의 반환 값이 int의 최댓값(즉, 231-1 또는 2,147,483,647)을 초과하는 경우 정수 오버플로로 인해 COUNT 함수가 실패합니다. COUNT 오버플로 시 ARITHABORT둘 다ANSI_WARNINGS 옵션이 OFF인 경우 COUNTNULL을 반환합니다. 그렇지 않으면 ARITHABORT 또는 ANSI_WARNINGS하나ON인 경우 쿼리가 중단되고 Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int. 산술 오버플로 오류가 발생합니다. 이러한 큰 결과를 올바르게 처리하려면 bigint를 반환하는 COUNT_BIG를 대신 사용합니다.

ARITHABORTANSI_WARNINGS가 모두 ON인 경우 ISNULL( <count-expr>, 0 )에서 COUNT 호출 사이트를 안전하게 래핑하여 식의 형식을 int NULL 대신 int NOT NULL로 강제 변환할 수 있습니다. COUNTISNULL로 래핑하면 오버플로 오류가 자동으로 표시되지 않으므로 정확성을 고려해야 합니다.

예제

A. COUNT 및 DISTINCT 사용

이 예제에서는 Adventure Works Cycles 직원이 보유할 수 있는 여러 직함의 수를 반환합니다.

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

결과 집합은 다음과 같습니다.

-----------
67
  
(1 row(s) affected)

B. COUNT(*) 사용

이 예제에서는 Adventure Works Cycles 직원의 총 수를 반환합니다.

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

결과 집합은 다음과 같습니다.

-----------
290
  
(1 row(s) affected)

C. 다른 집계와 COUNT(*) 사용

이 예제에서는 COUNT(*)SELECT 목록의 다른 집계 함수로 작동하는 것을 보여줍니다. 이 예제에서는 AdventureWorks2022 데이터베이스를 사용합니다.

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

결과 집합은 다음과 같습니다.

----------- ---------------------
14            3472.1428
  
(1 row(s) affected)

D. OVER 절 사용

이 예제에서는 절과 함께 OVER 함수 MAXAVGCOUNT 사용하여 MINAdventureWorks2022 데이터베이스 HumanResources.Department 테이블의 각 부서에 대해 집계된 값을 반환합니다.

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;

결과 집합은 다음과 같습니다.

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)

예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)

E. COUNT 및 DISTINCT 사용

이 예제에서는 특정 회사의 직원이 보유할 수 있는 여러 직함의 수를 반환합니다.

USE ssawPDW;
  
SELECT COUNT(DISTINCT Title)
FROM dbo.DimEmployee;

결과 집합은 다음과 같습니다.

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

F. COUNT(*) 사용

이 예제에서는 dbo.DimEmployee 테이블에 있는 총 행 수를 반환합니다.

USE ssawPDW;
  
SELECT COUNT(*)
FROM dbo.DimEmployee;

결과 집합은 다음과 같습니다.

-------------
296

G. 다른 집계와 COUNT(*) 사용

이 예제에서는 COUNT(*)SELECT 목록의 다른 집계 함수와 결합합니다. 그러면 연간 판매 할당량이 $500,000를 초과하는 영업 담당자의 수와 해당 영업 담당자의 평균 영업 할당량을 반환합니다.

USE ssawPDW;
  
SELECT COUNT(EmployeeKey) AS TotalCount, AVG(SalesAmountQuota) AS [Average Sales Quota]
FROM dbo.FactSalesQuota
WHERE SalesAmountQuota > 500000 AND CalendarYear = 2001;

결과 집합은 다음과 같습니다.

TotalCount  Average Sales Quota
----------  -------------------
10          683800.0000

H. HAVING과 함께 COUNT 사용

이 예제에서는 HAVING 절과 함께 COUNT를 사용하여 각각 15명 이상의 직원이 있는 회사의 부서를 반환합니다.

USE ssawPDW;
  
SELECT DepartmentName,
    COUNT(EmployeeKey)AS EmployeesInDept
FROM dbo.DimEmployee
GROUP BY DepartmentName
HAVING COUNT(EmployeeKey) > 15;

결과 집합은 다음과 같습니다.

DepartmentName  EmployeesInDept
--------------  ---------------
Sales           18
Production      179

9\. OVER와 함께 COUNT 사용

이 예제에서는 OVER 절과 함께 COUNT를 사용하여 지정된 각 판매 주문에 포함된 제품의 수를 반환합니다.

USE ssawPDW;
  
SELECT DISTINCT COUNT(ProductKey) OVER(PARTITION BY SalesOrderNumber) AS ProductCount
    , SalesOrderNumber
FROM dbo.FactInternetSales
WHERE SalesOrderNumber IN (N'SO53115',N'SO55981');

결과 집합은 다음과 같습니다.

ProductCount   SalesOrderID
------------   -----------------
3              SO53115
1              SO55981

참고 항목