Database/SQL Server

SQL Server - 그룹핑, 그룹핑_아이디 GROUPING, GROUPING_ID

청렴결백한 만능 재주꾼 2020. 12. 16. 04:56
반응형

그룹핑은 무엇인가 ? What is Grouping function

 

그룹핑(열)은 컬럼이 GROUP BY 목록에 집계되었나 안되었나 의 여부를 나타내는 것이다. 집계된 행에는 1로 표시가 되고 아니면 0이라고 표시된다.
Grouping(Column) indicates whether the column in a GROUP BY list is aggregated or not. Grouping returns 1 for aggregated or 0 for not aggregated in the result set.

 

SELECT Continent, Country, City, SUM(SaleAmount) AS TotalSales,
	GROUPING(Continent) as GP_Continent,
    GROUPING(Country) as GP_Country,
    GROUPING(City) as GP_City
FROM Sales
GROUP BY ROLLUP(Continent, Country, City)

 

위 쿼리의 결과

 

 

결과 화면에 NULL로 표시되어 굉장히 지저분하고 믿음이 안 간다.

NULL값을 고치는 작업을 해보자

SELECT 
CASE WHEN GROUPING(Continent) = 1 THEN 'ALL' ELSE ISNULL(Continent, 'Unknown') END AS Continent,
CASE WHEN GROUPING(Country) = 1 THEN 'ALL' ELSE ISNULL(Country, 'Unknown') END AS Country,
CASE WHEN GROUPING(City) = 1 THEN 'ALL' ELSE ISNULL(City, 'Unknown') END AS City,
SUM(SalesAmount) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Continent, Country, City)

 

ISNULL만으로도 NULL 값을 고칠 수 있다. 하지만 테이블에 NULL값이 있을 경우에는 쓰지 않는 것이 좋다.

SELECT 
	ISNULL(Continent, 'All') AS Continent,
	ISNULL(Country, 'All') AS Country,
	ISNULL(City, 'All') AS City
	SUM(SalesAmount) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Continent, Country, City)

 

 

 

GROUPING_ID

그루핑_아이디는 그룹핑과 같은데 그룹핑처럼 한개의 column을 받는게 아니고 column의 리스트를 받는다.

예)

GROUPING(column1)

GROUPING(column2)

vs

GROUPING(column1,column2,...)

 

그룹핑_ID 함수는 그룹화의 level을 계산한다.

Grouping_id function computes the level of grouping

 

그룹핑과 그룹핑아이디의 차이점 Difference between GROUPING and Gourping_ID

문법자체로는 그룹핑 함수는 single column에 쓰이고 그룹핑_ID 함수는 GROUP BY 목록과 똑같이 쓴다.
Syntax: GROUPING function is used on single column, where as the column list for GROUPING_ID function must match with GROUP BY column list.

 

그룹핑은 행이 집계가 되었나 안되었나에 대해서 0과 1로 표시를 해준다.
GROUPING indicates whether the column in a GROUP BY list is aggregated or not. Grouping returns 1 for aggregated or 0 for not aggregated in the result set.

그룹핑_ID는 그룹핑함수와 비슷하지만 2진수로 리턴하는 것이 아니라 10진수로 리턴한다.
GROUPING_ID() concatenates all the GROUPING() functions, perform the binary to decimal conversion, and returns the equivalent integer.

 

10진수를 2진수로 풀어보면 GROUPING을 일일히 한 것처럼 어떤 열이 aggregate가 되었는지 알 수 있다.

SELECT Continent, Country, City, 
	SUM(SaleAmount) AS TotalSales, 
	GROUPING_ID(Continent, Country,City) AS GPID
FROM Sales
GROUP BY ROLLUP(Continent, Country, City)
ORDER BY GPID

위 쿼리의 결과(GPID로 정렬된 모습)

반응형