출처1 : http://kokun.tistory.com/entry/MSSQL-ROLLUP-GROUPINGID-CUBE-%ED%95%A8%EC%88%98
아래 방법으로 토탈 및 서브토탈 등을 구할 수 있다.
하지만 rollup한 테이블에 정보를 다시 보여주려면 key로 조인하여야 하는데,
조인을 하는 동안 순서가 엉크러져버리는 경우가 있었다.
해서 아래와 같은 방법으로 order by 절을 구성하여 null을 맨 아래로 내리면서 sort 할 수 있었다.
SELECT *
FROM #TMP
ORDER BY
CASE WHEN RGF IS NULL THEN 1 ELSE 0 END, RGF,
CASE WHEN RFULL_PATH_NAME IS NULL THEN 1 ELSE 0 END, RFULL_PATH_NAME,
CASE WHEN EQUIP_ID IS NULL THEN 1 ELSE 0 END, EQUIP_ID
예시) DB명:sqlDB / 테이블명:buyTbl
총합 또는 중간 합계가 필요하다면 GROUP BY 절과 함께 ROLLUP 또는 CUBE를 사용하면 된다.
만약 분류(groupName)별로 합계 및 그 총합을 구하고 싶다면 다음의 구문을 사용하자.
SELECT num, groupName, SUM(price*amount) AS [비용]
FROM buyTbl
GROUP BY ROLLUP (groupName, num) ;
중간중간에 num 열이 NULL로 되어 있는 추가된 행이 각 그룹의 소합계를 의미한다.
또, 마지막 행은 각 소합계의 합계, 즉 총합계의 결과가 나왔다.
앞의 구문에서 num은 Primary Key이며, 그룹화되지 않게 하는 효과를 위해서 넣어 준 것이다.
만약 소합계 및 총합계만 필요하다면 다음과 같이 num을 빼면 된다.
SELECT groupName, SUM(price*amount) AS [비용]
FROM buyTbl
GROUP BY ROLLUP (groupName) ;
한눈에 데이터인지 합계인지를 알고 싶으면 GROUPING_ID() 함수를 사용할 수 있다.
GROUPING_ID() 함수의 결과가 0이면 데이터, 1이면 합계를 위해 추가된 열이라고 보면 된다.
SELECT groupName, SUM(price*amount) AS [비용]
, GROUPING_ID(groupName) AS [추가행여부]
FROM buyTbl
GROUP BY ROLLUP(groupName) ;
CUBE 절도 ROLLUP과 비슷한 개념이지만, 다차원 정보의 데이터를 요약하는데 더 적당하다.
물품 | 색상 | 수량 |
컴퓨터 | 검정 | 11 |
컴퓨터 | 파랑 | 22 |
모니터 | 검정 | 33 |
모니터 | 파랑 | 44 |
이 테이블에서 물품별 소합계 및 색상별 소합계를 모두 보고 싶다면 CUBE를 사용할 수 있다.
SELECT prodName, color, SUM(amount) AS [수량합계]
FROM cubeTbl
GROUP BY CUBE (color, prodName) ;