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이기 때문에 따로 직업 이외의 모든 행에 똑같은 내용을 지닌 컬럼이 없을 경우
직업 별로만 합계만 나오네요
이러면 테이블을 만들 때 확실히 만들지 않으면 원하는 값을 못 구할 수도 있겠네요...
네 이상입니다.
봐주셔서 감사합니다^^
'IT > MSSQL' 카테고리의 다른 글
[MS SQL] SELECT (AND, OR , IN, NOT IN, 서브쿼리) (0) | 2020.03.04 |
---|---|
[MS SQL] ROW_NUMBER() ,DENSE_RANK(), RANK() 순위함수 + NTILE(*), PARTITION BY() (0) | 2020.03.02 |
[MS SQL] WITH (NOLOCK) 공유 잠금 해제 (0) | 2020.02.25 |
[MS SQL] DB..테이블 -다른디비의 테이블 접근 쿼리 (0) | 2020.01.22 |
[MS SQL] N'' -유니 코드 (0) | 2020.01.22 |