아미(아름다운미소)

[MSSQL 문법]GROUP BY로 행 그룹화 본문

데이타베이스/MSSQL

[MSSQL 문법]GROUP BY로 행 그룹화

유키공 2017. 12. 14. 16:03

SQL Server 2005

GROUP BY 절을 사용하여 결과 집합에서 각 행의 집계 값을 만듭니다. GROUP BY 절을 사용하지 않으면 집계 함수는 SELECT 문에 대해 하나의 집계 값만 보고합니다.

다음 예에서는 데이터베이스에서 각 판매 주문의 합계를 찾습니다.

USE AdventureWorks;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID ;
GO

GROUP BY 키워드는 그룹화 열로 알려진 열 목록 이전에 옵니다. GROUP BY 절은 결과 집합의 행을 제한합니다. 즉, 그룹화 열에 있는 각 고유 값에 대해 행이 하나만 있습니다. 각 결과 집합 행에는 그룹화 열의 특정 값과 관련된 요약 데이터가 포함되어 있습니다.

SELECT 문에 GROUP BY가 포함되어 있는 경우 SELECT 목록에 지정할 수 있는 항목이 제한됩니다. SELECT 목록에 허용되는 항목은 다음과 같습니다.

  • 그룹화 열
  • 매개 변수 중 하나가 열 이름인 집계 함수처럼 그룹화 열의 각 값에 대해 값을 하나만 반환하는 식. 이러한 식을 벡터 집계라고 합니다.

예를 들어 TableX에는 다음이 포함됩니다.

ColumnAColumnBColumnC

-------

-------

-------

1

abc

5

1

def

4

1

ghi

9

2

jkl

8

2

mno

3

ColumnA가 그룹화 열일 경우 결과 집합에는 두 개의 행, 즉 값 1에 대한 정보를 요약하는 행과 값 2에 대한 정보를 요약하는 행이 포함됩니다.

ColumnA가 그룹화 열이면 ColumnB 또는 ColumnC가 ColumnA의 각 값에 대해 단일 값을 반환할 수 있는 집계 함수에서 매개 변수일 경우에만 이러한 열을 참조할 수 있습니다. SELECT 목록에 MAX(ColumnB), SUM(ColumnC), AVG(ColumnC) 등의 식을 포함할 수 있습니다.

SELECT ColumnA,
       MAX(ColumnB) AS MaxB,
       SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA

이 SELECT 문은 ColumnA의 각 고유 값에 대해 하나씩 모두 두 개의 행을 반환합니다.

ColumnA     MaxB SumC        
----------- ---- ----------- 
1           ghi  18          
2           mno  11          

(2 row(s) affected)

그러나 다음과 같이 SELECT 목록에 식 ColumnB만 포함할 수는 없습니다.

SELECT ColumnA,
       ColumnB,
       SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA

GROUP BY는 ColumnA에서 값이 1인 행을 하나만 반환할 수 있으므로 ColumnA의 값 1과 연결된 ColumnB의 값 3개(abc, def 및 ghi)를 반환할 수는 없습니다.

데이터 형식이 다른 값을 반환하는 함수에 있지 않으면 ntexttextimage 또는 bit 열에 GROUP BY나 HAVING을 사용할 수 없습니다. 데이터 형식이 다른 값을 반환하는 함수로는 SUBSTRING 및 CAST가 있습니다.


Comments