본문 바로가기
프로그래밍/MSSQL

MSSQL 소계 합계 사용하기 CROSS JOIN

by 최돠 2015. 6. 1.

MSSQL 소계 합계 사용하기 CROSS JOIN

 

MSSQL에서 많이 쓰이는 소계 합계 구하는 방식입니다.

2번째 방법으로 CROSS JOIN을 사용하여 구하는 법을 알려드리겠습니다.

 

저번에 작성했던 것과 동일 하게

일단 기본적으로 아래와 같이 생성해줍니다.

create table test
(id int,
 num int,
 rank int)
 대충간단하게 작성하였습니다.
insert into test
 (id, num , rank )
 select 4, 200, 2220
 union all
 select 6, 300, 3330
 union all
 select 3, 100, 4330
 union all
 select 1, 400, 3230
 union all
 select 5, 200, 4340
 union all
 select 2, 100, 4330

 

 

아래의 소스를 보면 무척복잡하다 일단은 크로스조인으로 

(select 1 as gb union all select 2 union all select 3)이 부분을 생성해 주는데

이유는 1은 데이터를 보여주기위한 2번은 소계를 구하기 위한 3은 합계를 구하기위한 데이터들이다. 이러한 데이터들은 크로스 조인으로 생성해준후에 case 조건을 줘서

아래와같이 소계합계를 구하면 된다. 여기서도 중요한건 gorup와 select조건을 동일하게 하여야하고 물론 sum 합을 구하는건 빼준다 이전에도 말했듯이 어떤것에 대한 그룹인지를 확인해보면

왜 동일하게 적는지 알것이다.

아래와같이 작성을해주면된다.

 

적어도 몇번씩 테이블을 만들어보고 계속 연습하셔야 이해가 빠르게 됩니다.

이게 어려우시면 rullup로 먼저 이해하고 이걸하시면 조금더 쉽게 이해하실수 있을거라 생각합니다.

SELECT       case b.gb when 1 then CAST(a.id as varchar(10))
                      when 2 then '소계'
                      when 3 then '합계'
       end as id,
       case when b.gb in (1,2) then a.num end as num,
       SUM(rank) as rank
FROM 
       test1 a
CROSS JOIN
       (select 1 as gb union all select 2 union all select 3) b
GROUP BY

       b.gb,
       case b.gb when 1 then CAST(a.id as varchar(10))
                      when 2 then '소계'
                      when 3 then '합계'
       end,
       case when b.gb in (1,2) then a.num end
ORDER BY

       case when case when b.gb in (1,2) then a.num end is null then 999
              else case when b.gb in (1,2) then a.num end end, gb

 

이 부분도 GROUP BY,ORDER BY 부분을 잘 작서해야 합니다. when의 1,2,3은 위에서 말씀드렸던 (select 1 as gb union all select 2 union all select 3) 이 부분을 나타낸 것입니다.

'프로그래밍 > MSSQL' 카테고리의 다른 글

MSSQL HAVING 사용하기  (0) 2015.06.11
IF NOT EXISTS 사용하기  (2) 2015.06.11
GROUP BY 사용하기  (0) 2015.06.01
cross join 사용하기  (2) 2015.06.01
MSSQL 소계 합계 사용하기 ROLLUP  (0) 2015.05.28

댓글