피벗

2014-09-09 6 views
0

같은 컬럼에 행을 변환 내가 가지고있는 것처럼 데이터 : 내가 피벗/UNPIVOT보고에서 나는 보았다하지만 이후 관련이없는 보이는 곳마다피벗

formid formownerid approverid approverid approverid approverid 
1  100   102   103   104   NULL 
2  200   107   103   109   105 
3  400   201   202   NULL  NULL 

: 나는 그것을 변환 할

formid formownerid approverid 
1  100   102 
1  100   103 
1  100   104 
2  200   107 
2  200   103 
2  200   109 
2  200   105 
3  400   201 
3  400   210 

우리는 집합을 필요로하지 않습니다.

+0

상태가 긴급했기 때문에 func을 코딩하고 반복했습니다. 모든 답변을 주셔서 감사합니다 – Doruk

답변

-2

한 가지 가능한 Approch :

SELECT FROMID, FROMOWNERID, APPROVERID, NULL APPROVERID, NULL APPROVERID, NULL APPROVERID 
FROM yourtable 
WHERE FROMID = 100 
AND APPROVERID = 102 
UNION ALL 
SELECT FROMID, FROMOWNERID, NULL APPROVERID, APPROVERID APPROVERID, NULL APPROVERID, NULL APPROVERID 
FROM yourtable 
WHERE FROMID = 100 
AND APPROVERID = 103 
UNION ALL 
SELECT FROMID, FROMOWNERID, NULL APPROVERID, NULL APPROVERID, APPROVERID APPROVERID, NULL APPROVERID 
FROM yourtable 
WHERE FROMID = 100 
AND APPROVERID = 104 
---- 
------- 
And So On 
+0

우리는 큰 데이터에 대해 이야기하고 있습니다. 우리는 글자를 쓰지 않습니다. – Doruk

+0

PLSQL, 파이프 라인 기능을 제안합니다. – Maddy

4

집계 피벗의 필요한 부분이지만, 여기에 적용 할 간단합니다; 당신이 원하지 않는 sum하지만 max 집계 잘 작동합니다 :

select * 
from (
    select t.*, 
    row_number() over (partition by formid, formownerid 
     order by approverid) as rn 
    from t42 t 
) 
pivot (max(approverid) as approverid for (rn) in (1, 2, 3, 4)); 

    FORMID FORMOWNERID 1_APPROVERID 2_APPROVERID 3_APPROVERID 4_APPROVERID 
---------- ----------- ------------ ------------ ------------ ------------ 
     1   100   102   103   104    
     2   200   103   105   107   109 
     3   400   201   210       

또는 당신이 그 (것)들에게 유효한 식별자를 만들기 위해 명시 적으로 열 이름 접두사를 지정할 수 있습니다

pivot (max(approverid) as approverid 
    for (rn) in (1 as a, 2 as b, 3 as c, 4 as d)); 

는 내부 쿼리가 의사 열 rn을 추가 실제 승인자 ID는 미리 알 수 없으므로 표 결과에 고정하여 피벗 할 값을 제공합니다.

수동 접근 방식은 조금 더 명확이 할 수 있습니다

select formid, formownerid, 
    max(case when rn = 1 then approverid end) as approverid_1, 
    max(case when rn = 2 then approverid end) as approverid_2, 
    max(case when rn = 3 then approverid end) as approverid_3, 
    max(case when rn = 4 then approverid end) as approverid_4 
from (
    select t.*, 
    row_number() over (partition by formid, formownerid 
     order by approverid) as rn 
    from t42 t 
) 
group by formid, formownerid 
order by formid, formownerid; 

    FORMID FORMOWNERID APPROVERID_1 APPROVERID_2 APPROVERID_3 APPROVERID_4 
---------- ----------- ------------ ------------ ------------ ------------ 
     1   100   102   103   104    
     2   200   103   105   107   109 
     3   400   201   210       

내부 쿼리가 동일합니다. case 문은 위의 각 열을 생산,하지만 당신은 여분의 공백이 많은 여러 행을 얻을 max없이 그룹화 :

select formid, formownerid, 
    case when rn = 1 then approverid end as approverid_1, 
    case when rn = 2 then approverid end as approverid_2, 
    case when rn = 3 then approverid end as approverid_3, 
    case when rn = 4 then approverid end as approverid_4 
from (
    select t.*, 
    row_number() over (partition by formid, formownerid 
     order by approverid) as rn 
    from t42 t 
); 

    FORMID FORMOWNERID APPROVERID_1 APPROVERID_2 APPROVERID_3 APPROVERID_4 
---------- ----------- ------------ ------------ ------------ ------------ 
     1   100   102           
     1   100      103       
     1   100         104    
     2   200   103           
     2   200      105       
     2   200         107    
     2   200             109 
     3   400   201           
     3   400      210       

공지 사항 (대부분에서) 각 formid/formownerid 하나의 열을 만 값이 있다고 조합이지만 다른 행에 나타납니다. max은 여러 행을 표시하지 않습니다. 피벗 버전은 후드 아래에서 비슷한 기능을 수행합니다.

SQL Fiddle 중간 단계와 수동 방식을 보여주는 피봇 버전.

+0

좋은 점 :) ........ – Maddy

+0

감사합니다. 나는 작동하지만 추측하기는하지만 오라클 객체 피벗에서 문제가 발생했습니다. 그것은 어려운 길이며 반복된다. 그리고 어쨌든 덕분에 문자열을 승인자 열에 추가했습니다. – Doruk

+0

@Doruk - 피벗은 11g까지 사용 가능하지 않았으므로 이전 버전을 사용 중이면 '객체'가됩니다. 맥스/케이스 버전은 이전 버전에서도 작동합니다. –