다음을 통해 공유


COUNT(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics분석 플랫폼 시스템(PDW)Microsoft Fabric의 SQL 분석 엔드포인트Microsoft Fabric의 웨어하우스Microsoft Fabric의 SQL 데이터베이스

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

Transact-SQL 구문 표기 규칙

문법

집계 함수 구문:

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

분석 함수 구문:

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

인수

전체

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

독특한

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

표현식

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

*

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

오버 ([ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ] )

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

반환 형식

  • 이면 INt NOT NULLANSI_WARNINGSON반환합니다. 그러나 SQL Server는 식을 래핑ISNULL하지 않는 한 항상 메타데이터에서 int NULL로 처리 COUNT 합니다.

  • 이면 int NULLANSI_WARNINGS 을 반환합니다OFF.

설명

COUNT(*) 을 반환하지 않으면 GROUP BY 결과 집합의 카디널리티(행 수)가 반환됩니다. 이 개수에는 모든 NULL 값과 중복이 있는 행이 포함됩니다.

COUNT(*)가 있는 GROUP BY은 각 그룹의 행 수를 반환합니다. 이 개수에는 값과 중복이 포함 NULL 됩니다.

COUNT(ALL <expression>) 는 그룹의 각 행에 대한 식을 계산하고 null이 아닌 값의 수를 반환합니다.

COUNT(DISTINCT <expression>) 는 그룹의 각 행에 대한 식을 계산하고 Null이 아닌 고유한 값의 수를 반환합니다.

결정적 및 비결정적 사용

COUNT_BIG는 and ORDER BY없이OVER 사용할 때 결정적 함수입니다.

COUNT_BIG는 and 절과 ORDER BY함께OVER 사용할 때 비결정적입니다.

사용 OVERORDER BY 결정론적인
아니오 Yes
Yes 아니오

자세한 내용은 결정적 함수와 비결정적 함수를 참조하세요.

ARITHABORT 및 ANSI_WARNINGS

  • COUNT int의 최대값(231-1 또는 2,147,483,647)을 초과하는 값을 반환하면 정수 오버플로로 인해 함수가 실패합니다.

  • 오버플로와 옵션 및 ANSI_WARNINGS 옵션이 모두ARITHABORT 있으면 COUNTOFF.를 COUNT 반환합니다NULL. 그렇지 않으면 ARITHABORTANSI_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 NULL로 강제 변환할 수 있습니다. 래핑 COUNTISNULL 은 오버플로 오류가 자동으로 표시되지 않으므로 정확성을 위해 고려해야 합니다.

예제

이 문서의 코드 샘플은 AdventureWorks2025 또는 AdventureWorksDW2025 샘플 데이터베이스를 사용합니다. 이 데이터베이스는 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있습니다.

A. COUNT 및 DISTINCT 사용

다음은 직원이 보유할 수 있는 HumanResources.Employee 테이블의 여러 직위 수를 반환하는 예제입니다.

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

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

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

B. COUNT(*) 사용

이 예제에서는 테이블의 총 직원 수를 반환합니다 HumanResources.Employee .

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

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

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

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

이 예제에서는 COUNT(*)SELECT 목록의 다른 집계 함수로 작동하는 것을 보여줍니다.

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

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

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

D. OVER 절 사용

이 예제에서는 절과 함께 , , 및 함수를 사용하여 MIN테이블의 OVER 각 부서에 HumanResources.Department 대해 집계된 값을 반환합니다.COUNTAVGMAX

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;

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

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

예: 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 사용

이 예제에서는 COUNT 절과 함께 HAVING를 사용하여 각각 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 사용

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

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