SQL 질문과 답변 게시판
Microsoft SQL Server와 관련된 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.
글 수 10,532
tblCompanyData
회사 | 갯수 | 년도 |
A | 1 | 2006 |
A | 8 | 2007 |
A | 3 | 1900 |
B | 1 | 2007 |
B | 1 | 2008 |
B | 1 | 2010 |
B | 8 | 2012 |
C | 1 | 2006 |
C | 13 | 2007 |
C | 17 | 2008 |
C | 2 | 2009 |
C | 1 | 2010 |
C | 11 | 2011 |
D | 1 | 2011 |
D | 42 | 2012 |
E | 1 | 2009 |
E | 1 | 2010 |
E | 1 | 2011 |
E | 3 | 1900 |
위와 같은 테이블이 있을 경우 현재 년도 포함하여 4년 전 데이터까지 출력하려고 합니다.
현재 2012년이니 2009년도데이터까지 출력을 하려고하고, 출력하고 싶은 형태는
회사 | 합계 | 2012 | 2011 | 2010 | 2009 | 기타 |
A | 12 | 0 | 0 | 0 | 0 | 12 |
B | 11 | 8 | 0 | 1 | 0 | 2 |
C | 45 | 0 | 11 | 1 | 2 | 31 |
D | 43 | 42 | 1 | 0 | 0 | 0 |
E | 4 | 0 | 1 | 0 | 0 | 3 |
위와 같이 출력하고 싶습니다.
아무리 생각해도 머리가 돌아가질 않네요;;
임시테이블을 사용하여 루프를 돌아서 계산 후 넣을까도 했지만, 좀 다른 방법이 있지 않을까해서 이렇게 질문 올립니다.
좋은 답변 부탁드립니다.
2012.04.20 11:02:34 (*.234.38.57)
with cte(회사, 갯수, 년도)
as (
select 'A', '1', '2006' union all
select 'A','8','2007' union all
select 'A','3','1900' union all
select 'B', '1','2007' union all
select 'B','1','2008' union all
select 'B','1','2010' union all
select 'B','8','2012' union all
select 'C','1','2006' union all
select 'C','13','2007' union all
select 'C','17','2008' union all
select 'C','2','2009' union all
select 'C','1','2010' union all
select 'C','11','2011' union all
select 'D', '1', '2011' union all
select 'D', '42', '2012' union all
select 'E', '1', '2009' union all
select 'E', '1', '2010' union all
select 'E', '1', '2011' union all
select 'E', '3', '1900'
)
select
회사,
SUM(cast(갯수 as int)) as [합계],
sum(case when 년도 = 2012 then 갯수 else 0 end) as [2012] ,
sum(case when 년도 = 2011 then 갯수 else 0 end) as [2011] ,
sum(case when 년도 = 2010 then 갯수 else 0 end) as [2010] ,
sum(case when 년도 = 2009 then 갯수 else 0 end) as [2009] ,
SUM(CASE WHEN 년도 NOT IN (2012, 2011, 2010, 2009) THEN 갯수 ELSE 0 END) AS [기타]
from cte
group by 회사
as (
select 'A', '1', '2006' union all
select 'A','8','2007' union all
select 'A','3','1900' union all
select 'B', '1','2007' union all
select 'B','1','2008' union all
select 'B','1','2010' union all
select 'B','8','2012' union all
select 'C','1','2006' union all
select 'C','13','2007' union all
select 'C','17','2008' union all
select 'C','2','2009' union all
select 'C','1','2010' union all
select 'C','11','2011' union all
select 'D', '1', '2011' union all
select 'D', '42', '2012' union all
select 'E', '1', '2009' union all
select 'E', '1', '2010' union all
select 'E', '1', '2011' union all
select 'E', '3', '1900'
)
select
회사,
SUM(cast(갯수 as int)) as [합계],
sum(case when 년도 = 2012 then 갯수 else 0 end) as [2012] ,
sum(case when 년도 = 2011 then 갯수 else 0 end) as [2011] ,
sum(case when 년도 = 2010 then 갯수 else 0 end) as [2010] ,
sum(case when 년도 = 2009 then 갯수 else 0 end) as [2009] ,
SUM(CASE WHEN 년도 NOT IN (2012, 2011, 2010, 2009) THEN 갯수 ELSE 0 END) AS [기타]
from cte
group by 회사
2012.04.20 11:11:03 (*.90.170.18)
Tip & 강좌 게시판에 다이나믹 pivot에 대한 내용이 있습니다.
참고해 보세요
http://www.sqler.com/?document_srl=133535&mid=bSQLQA&rnd=488573#comment_488573
select 문의 pivot 연산자를 사용해보세요.
http://msdn.microsoft.com/ko-kr/library/ms177410.aspx