IT/MSSQL

[MS SQL] ROLLUP 소계, 합계

유자애플 2020. 2. 25. 15:59
반응형

drop table #TEST1

go

 Create Table #TEST1(

 

 Name        Varchar(50),   --이름

 age         int,              --나이

 Assets      int,             --자산

 Liabilities int,                --부채

 job  nvarchar(10)    --직업

 

)

Insert Into #TEST1

values ('이희은', 28, 3000, 1300, '선생님')

Insert Into #TEST1

values ('최종은', 27, 5000, 1300, '학원강사')

Insert Into #TEST1

values ('이수민', 31, 2000, 2300, '선생님')

Insert Into #TEST1

values ('최덕희', 27, 1000, 3000, '연구원')

Insert Into #TEST1

values ('이정훈', 36, 2000, 1400, '학원강사')

 

제가 일단 ROLLUP에 사용할 임시테이블 및 테이블 정보를 만들었습니다.

따라 하실 분은 복사해서 사용해 주세요^^

 

위의 테이블을 만들었다면 한번 SELECT 해볼까요?

select *

from #TEST1

 

 

이런 식으로 나오겠죠?

 

근데 rollup을 하기 전에 주위 사항 rollup은 Group by가 필수 입니다.

 

 

그럼 여기서 합계를 구하는 ROLLUP을 사용하여 자산의 총합을 구해볼까요?

 

 select Name,age,sum(Assets),Liabilities,job

from #TEST1

group by Name,age,Liabilities,job

with rollup

 

보시면 맨 밑에 자산의 합계인 13000이 찍히는 것을 볼수 있습니다.

 

하지만 뭔가 이상하죠? 분명 5개 였던 행이 21개가 되어버렸네요

 

그것은 Group by 다음에 with rollup을 할 경우 각 컬럼당 rollup을 하기 때문에 중첩이 되기 때문에

 

위에 임시테이블로 봤을 때 Name에서 한번, age에서 한번, Liabilities에서 한번 , job에서 한번 

 

총 네번의 rollup이 이루어졌기 때문에 각 행당 4번씩 이루어져 20번에 마지막 합계 행까지 21개가 된것입니다.

 

그렇다면 어떻게 해야 중첩이 이루어지지 않을까요 그것은 바로

 

select 

Name as 이름,

age as 나이 ,

sum(Assets) as 자산,

Liabilities as 부채,

job as 직업

from #TEST1

group by

rollup((job,Name,age,Liabilities))

 

group by 컬럼.... rollup(컬럼..(컬럼...)) 입니다.

 

rollup()의 경우 합계를 구합니다. 그리고 모든 컬럼에 따라 중첩합니다.

하지만 rollup(())의 경우 중첩을 하지 않고 소계만 이루어집니다.

 

위와 같이 나오게 됩니다. 

 

그리고 만약 직업 별 합계를 보고 싶다면 

 

 select 

Name as 이름,

age as 나이 ,

sum(Assets) as 자산,

Liabilities as 부채,

job as 직업

from #TEST1

group by job,

rollup((Liabilities,age,Name))


위와 같이 해주시면 

 

이렇게 나옵니다.

 

하지만 Group by이기 때문에 따로 직업 이외의 모든 행에 똑같은 내용을 지닌 컬럼이 없을 경우

 

직업 별로만 합계만 나오네요

 

이러면 테이블을 만들 때 확실히 만들지 않으면 원하는 값을 못 구할 수도 있겠네요...

 

네 이상입니다.

 

봐주셔서 감사합니다^^

반응형