2016-07-08 5 views
0
오라클 11의 PIVOT와

문제점 : 다음을 실행할 때, 모든 필드 데이터에 정규화 결과를 얻을 F2-F4 데이터가 존재; 항상 데이터가 있으므로 F1 키입니다 :손실이 가입

select t1.F1, t2.F2, t2.F3, t2.F4 
from schema.t1, 
    schema.t2 
where 
t1.F1 = t2.F1 (+) 

가 지금은 모든 필드 F2 가입 오라클의 PIVOT 기능을 사용하기 위해 이동 - F4 F2 등 많은 사이의 모든 F2 필드에 대한 필드 하나가되도록 5 행, 다음과 같이 모두가 연결된 같이

select * from (
select F1, 
TRIM("1_F2") || TRIM("2_F2") || TRIM("3_F2") || TRIM("4_F2") || TRIM("5_F2") as "F2", 
TRIM("1_F3") || TRIM("2_F3") || TRIM("3_F3") || TRIM("4_F3") || TRIM("5_F3") as "F3", 
TRIM("1_F4") || TRIM("2_F4") || TRIM("3_F4") || TRIM("4_F4") || TRIM("5_F4") as "F4" 
from (
select ROWNUM as RN, T.* from (
select t1.F1, t2.F2, t2.F3, t2.F4 
from schema.t1, 
     schema.t2 
where 
t1.F1 = t2.F1 (+) 
) T 
) 
PIVOT ( 
MAX(F2) as "F2", 
MAX(F3) as "F3", 
MAX(F4) as "F4" 
FOR RN in (1,2,3,4,5) 
) 
) 

이 데이터를 반환되면, F2 행 중에서 찾을 수있는 모든 데이터는 예를 들어, 다시 모든 레코드에 대해 단일 F2 로우로 결합되어 제공되도록. 실제로 작동하는 레코드의 경우 정규화 된 결과에서 찾은 모든 데이터를 얻습니다. 그러나 작동하지 않으면 정규화 된 결과에서 찾은 데이터가 반환되지 않습니다.

아이디어가 있으십니까? 내가 뭘 놓치고 있니?

미리 감사드립니다.

답변

1

OK, I는 사용 잘못된 기능을했다. Oracle LISTAGG 함수는 필요한 작업을 수행합니다. 예 : 호평

select F1, 
LISTAGG (F2, ' ') within group (order by F1) as "F2", 
LISTAGG (F3, ' ') within group (order by F1) as "F3", 
LISTAGG (F4, ' ') within group (order by F1) as "F4" 
from (
select t1.F1, t2.F2, t2.F3, t2.F4 
from schema.t1, 
     schema.t2 
where 
t1.F1 = t2.F1 (+) 
) group by F1 

, 예 :

create table myschema.t1 (
F1 varchar2(10) 
) 

create table myschema.t2 (
F1 varchar2(10), 
F2 varchar2(10), 
F3 varchar2(10), 
F4 varchar2(10) 
) 

insert into myschema.t1 (F1) values ('1'); 
insert into myschema.t1 (F1) values ('1'); 
insert into myschema.t1 (F1) values ('1'); 

insert into myschema.t2 (F1,F2,F3,F4) values ('1','Hello1','World1','1'); 
insert into myschema.t2 (F1,F2,F3,F4) values ('1','Hello2','World2','2'); 
insert into myschema.t2 (F1,F2,F3,F4) values ('1','Hello3','World3','3'); 

commit; 

select F1, 
LISTAGG (F2, ' ') within group (order by F1) as "F2", 
LISTAGG (F3, ' ') within group (order by F1) as "F3", 
LISTAGG (F4, ' ') within group (order by F1) as "F4" 
from (
select t1.F1, t2.F2, t2.F3, t2.F4 
from myschema.t1, 
     myschema.t2 
where 
t1.F1 = t2.F1 (+) 
) group by F1 

당신이 얻을 :

 
    F1 F2                F3                F4 
    -- -------------------------------------------------------------- -------------------------------------------------------------- ----------------- 
    1 Hello1 Hello1 Hello1 Hello2 Hello2 Hello2 Hello3 Hello3 Hello3 World1 World1 World1 World2 World2 World2 World3 World3 World3 1 1 1 2 2 2 3 3 3 

흠, 중복을 많이? 이것을 실행 해보십시오 :

select F1, 
LISTAGG (F2, ' ') within group (order by F1) as "F2", 
LISTAGG (F3, ' ') within group (order by F1) as "F3", 
LISTAGG (F4, ' ') within group (order by F1) as "F4" 
from (
select distinct t1.F1, t2.F2, t2.F3, t2.F4 
from myschema.t1, 
     myschema.t2 
where 
t1.F1 = t2.F1 (+) 
) group by F1 

는 이제 얻을 :

 
    F1 F2      F3      F4 
    -- -------------------- -------------------- ---------- 
    1 Hello1 Hello2 Hello3 World1 World2 World3 1 2 3 
+0

이 중 하나를 평가하지 않습니다 - 당신의 괄호가 일치하지 않습니다. – dipdapdop

+0

@dipdapdop 네가 옳았다. 그리고 중요한 부분을 불필요하게 하위 선택 항목에 포함 시켰으므로 그 부분도 생략했습니다. –

+0

외부 선택 절에 여전히 구문 오류가 있습니다. WITH 블록에 몇 가지 테스트 데이터를 제공하는 것이 좋습니다. 완전히 작동하는 예제를 만드는 것이 좋습니다. – dipdapdop

관련 문제