출처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) ;

 

 















Posted by motolies
,