2012-04-23 3 views
1

다른 데이터 형식의 기간 및 세 개의 열이있는 쿼리가 있습니다.여러 열과 값의 피벗 해제

abc: int 
def: decimal 
hij: int 

이 세 열의 데이터는 다른 쿼리에서 제공됩니다.

Period abc def hij 
------ ---- ---- --- 
2012-01 10 0.00 4 
2012-02  5 0.00 5 
2012-03  0 2.40 8 

나는 다음과 같은 출력을 좀하고 싶습니다 : 여기

는 현재의 결과입니다

abc 2012-01 10 0.00 
abc 2012-02 5 0.00 
abc 2012-03 0 0.00 
def 2012-01 0 0.00 
def 2012-02 0 0.00 
def 2012-03 0 2.40 
hij 2012-01 4 0.00 
hij 2012-02 5 0.00 
hij 2012-03 8 0.00 

내가 UNPIVOT 사용하고자하지만, 나에게의 오류를 제공합니다 충돌 유형.

+0

당신이 현재의 결과를 생성하는 데 사용되는 쿼리를 제공 할 수 귀하의 질문에 쉽게 답하도록하기 위해? – erikxiv

+0

이 [답변]보십시오 (http://stackoverflow.com/questions/10266494/how-to-change-the-information-in-this-table-into-an-easy-to-use-form/10266894# 10266894). –

답변

4

오류는 UNPIVOT에서 정수와 십진수를 혼합하기 때문에 발생합니다.

언 피 보트를 원하지만 다른 열에서 다시 def을 분리하는 것처럼 보입니다.

는이 같은 원하는 결과로 보이는 달성 할 수 있었다 :

declare @t table(Period varchar(10), abc int, def decimal(5,2), hij int) 
insert into @t values ('2012-01',10,0.00,4) 
, ('2012-02',5,0.00,5) 
, ('2012-03',0,2.40,8); 

with a as (
    select cols, Period, val 
    from (select Period, abc=CAST(abc as decimal(5,2)), def, hij=CAST(hij as decimal(5,2)) from @t) p 
    UNPIVOT (
     val for cols in (abc, def, hij) 
    ) as unpvt 
) 
select a.cols 
, Period 
, abc_hij=case when cols in ('abc','hij') then CAST(val as int) else 0 end 
, def=case when cols = ('def') then val else 0.00 end 
from a 
order by cols, Period 
go 

결과 :

enter image description here

+0

고마워요. – berhiamt68

+0

당신은 천만에요. 이 방법이 효과가있는 경우 해결책에 따라 수락 됨 확인란을 선택하십시오. –

0
 
WITH c AS (
SELECT '2012-01' AS Period, 10 AS abc , 0.00 AS def, 4 AS hij 
UNION ALL 
SELECT '2012-02' AS Period,  5 AS abc, 0.00 AS def , 5 AS hij 
UNION ALL 
SELECT '2012-03' AS Period,  0 AS abc, 2.40 AS def, 8 AS hij 
) 
SELECT * FROM (
SELECT cc.title, c.Period,cc.val FROM c 
cross apply 
(
    VALUES('abc',abc),('def',def),('hij',hij) 
) cc (title,val) 
) t 
ORDER BY t.title 
관련 문제