그룹핑은 무엇인가 ? 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
'Database > SQL Server' 카테고리의 다른 글
SQL Server - Over 절 과 ROW_NUMBER() 함수 (0) | 2020.12.16 |
---|---|
SQL Server - 디버깅 Debugging (0) | 2020.12.16 |
SQL Server - 소계, 합계[롤업, 큐브] Rollup, Cube (0) | 2020.12.15 |
SQL Server - 무작위 날짜 데이터 생성 후 비어있는 날 채우기 Create a table with random date then Group by Date with no exception (0) | 2020.12.15 |
SQL Server - DATEDIFF() Function (0) | 2020.12.15 |