SQL Server / Query / ROLLUP
부분합 등을 구하고 싶다면 ROLLUP을 사용한다.
목차
기본
- 다음과 같은 sales 테이블이 있다고 하자. team은 소속, man은 직원, sales는 판매액이다.
select * from sales ;
- 다음과 같이 하면 직원별 소계, 팀별 소계, 전체 합계가 출력된다.
select id, team, man, sum( sales ) as sales from sales group by rollup ( team, man, id ) ;
- 다음과 같이 해도 결과는 같다.
select id, team, man, sum( sales ) as sales from sales group by team, man, id with rollup ;
집계함수 외의 열은 모두 포함되어야 한다. 예를 들어 아래처럼 id 열은 그룹화하지 않으면서 출력하고자 하면 에러가 난다.
select id, team, man, sum( sales ) as sales from sales group by rollup ( team, man ) ;
그룹화하는 열을 출력하지 않는 것은 가능하다.
select team, man, sum( sales ) as sales from sales group by rollup ( team, man, id ) ;
그룹에 대한 합계인지 확인하기
- grouping 함수를 이용하면 그룹에 대한 합계인지 아닌지 확인할 수 있다.
- 그룹합이라면 1을, 아니라면 0을 출력한다.
select id, team, man, sum( sales ) as sales, grouping( id ) as group_1, grouping( man ) as group_2, grouping( team ) as group_3 from sales group by rollup ( team, man, id ) ;
NULL 대신 다른 값 출력하기
- grouping 함수의 값을 이용하여 NULL 대신 의미에 맞는 값을 출력할 수 있다.
select case when grouping( id ) = 1 and grouping( man ) = 1 then '총합계' when grouping( id ) = 1 then '개인합계' when grouping( id ) = 0 then man end as man, sum( sales ) as sales from sales group by rollup ( man, id ) ;