적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
분석 플랫폼 시스템(PDW)
Microsoft Fabric의 SQL 분석 엔드포인트
Microsoft Fabric의 웨어하우스
Microsoft Fabric의 SQL 데이터베이스
이 함수는 그룹에 있는 항목의 수를 반환합니다.
COUNT은 COUNT_BIG 함수처럼 작동합니다. 이러한 함수는 해당 반환 값의 데이터 형식만이 다릅니다.
COUNT은 항상 int 데이터 형식 값을 반환합니다.
COUNT_BIG은 항상 bigint 데이터 형식 값을 반환합니다.
문법
집계 함수 구문:
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_clause는 FROM 절이 생성한 결과 집합을 COUNT 함수가 적용되는 파티션으로 나눕니다. 지정하지 않을 경우 쿼리 결과 집합의 모든 행이 단일 그룹으로 취급됩니다.
order_by_clause는 작업의 논리적 순서를 결정합니다. 자세한 내용은 OVER 절을 참조하세요.
반환 형식
이면 INt NOT NULL을
ANSI_WARNINGSON반환합니다. 그러나 SQL Server는 식을 래핑ISNULL하지 않는 한 항상 메타데이터에서 int NULL로 처리COUNT합니다.이면 int NULL
ANSI_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 사용할 때 비결정적입니다.
사용 OVER 및 ORDER BY 절 |
결정론적인 |
|---|---|
| 아니오 | Yes |
| Yes | 아니오 |
자세한 내용은 결정적 함수와 비결정적 함수를 참조하세요.
ARITHABORT 및 ANSI_WARNINGS
COUNTint의 최대값(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로 강제 변환할 수 있습니다. 래핑COUNT인ISNULL은 오버플로 오류가 자동으로 표시되지 않으므로 정확성을 위해 고려해야 합니다.
예제
이 문서의 코드 샘플은 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