2017-10-11 5 views
2

안녕하십니까, 아래의 표는 끔찍한 개발자가 디자인 한 것입니다.집계없이이 행을 Oracle의 열로 변환하는 방법은 무엇입니까?

이 표에는 USERS 지문과 USERID에 대한 데이터가 들어 있습니다. FINGERID 값은 (1,2,3,4,5,6,7,8,9,10,11,12,13,14)에서 ISLOCKEDISDUPLICATE1 또는 0 ... 각이다 FINGERID 이 이미지는 내가 2 주 이후를 수평 방법하지만 행운을 표시 할 BLOB

Name  Null  Type   
----------- -------- ------------- 
ROW_ID    NUMBER   
USERID  NOT NULL NVARCHAR2(75) 
TEMPLATE    BLOB   
FINGERID NOT NULL NVARCHAR2(20) 
ISLOCKED    NUMBER(3)  
ISDUPLICATE   NUMBER(3) 

에 저장 한 ... 아래 내가 사용이 시도

Name     Null  Type   
----------------------- -------- -------------   
USERID     NOT NULL NVARCHAR2(75) 
FINGERID_1      NVARCHAR2(20) 
FINGERID_1_TEMPLATE    BLOB   
FINGERID_1_ISLOCKED    NUMBER(3)  
FINGERID_1_ISDUPLICATE   NUMBER(3)  
FINGERID_2      NVARCHAR2(20) 
FINGERID_2_TEMPLATE    BLOB   
FINGERID_2_ISLOCKED    NUMBER(3)  
FINGERID_2_ISDUPLICATE   NUMBER(3)  
FINGERID_3      NVARCHAR2(20) 
FINGERID_3_TEMPLATE    BLOB   
FINGERID_3_ISLOCKED    NUMBER(3)  
FINGERID_3_ISDUPLICATE   NUMBER(3)  
FINGERID_4      NVARCHAR2(20) 
FINGERID_4_TEMPLATE    BLOB   
FINGERID_4_ISLOCKED    NUMBER(3)  
FINGERID_4_ISDUPLICATE   NUMBER(3)  
FINGERID_5      NVARCHAR2(20) 
FINGERID_5_TEMPLATE    BLOB   
FINGERID_5_ISLOCKED    NUMBER(3)  
FINGERID_5_ISDUPLICATE   NUMBER(3)  
FINGERID_6      NVARCHAR2(20) 
FINGERID_6_TEMPLATE    BLOB   
FINGERID_6_ISLOCKED    NUMBER(3)  
FINGERID_6_ISDUPLICATE   NUMBER(3)  
FINGERID_7      NVARCHAR2(20) 
FINGERID_7_TEMPLATE    BLOB   
FINGERID_7_ISLOCKED    NUMBER(3)  
FINGERID_7_ISDUPLICATE   NUMBER(3)  
FINGERID_8      NVARCHAR2(20) 
FINGERID_8_TEMPLATE    BLOB   
FINGERID_8_ISLOCKED    NUMBER(3)  
FINGERID_8_ISDUPLICATE   NUMBER(3)  
FINGERID_9      NVARCHAR2(20) 
FINGERID_9_TEMPLATE    BLOB   
FINGERID_9_ISLOCKED    NUMBER(3)  
FINGERID_9_ISDUPLICATE   NUMBER(3)  
FINGERID_10      NVARCHAR2(20) 
FINGERID_10_TEMPLATE    BLOB   
FINGERID_10_ISLOCKED    NUMBER(3)  
FINGERID_10_ISDUPLICATE   NUMBER(3) 
FINGERID_11      NVARCHAR2(20) 
FINGERID_11_TEMPLATE    BLOB   
FINGERID_11_ISLOCKED    NUMBER(3)  
FINGERID_11_ISDUPLICATE   NUMBER(3) 

선택 문에 대한 내 원하는 구조 코드는 표시 할 수 없기 때문에 운이 없다. TEMPLATE (BLOB), ISLOCKED, 그것이 집계를 필요로하기 때문에 ... 나는 그냥 그냥 어떻게 데이터를 표시하고 싶지만 각 수평 방식으로 pivot은 좋은 선택이 아니다, group by 각 FINGERID에 대한 ISDUPLICATED 작동하지 않기 때문에 USERID.

`select 
     USERID, 
     SUM(case when FINGERID=1 then 1 END) as FINGERID_1, 
     SUM(case when FINGERID=2 then 2 END) as FINGERID_2, 
     SUM(case when FINGERID=3 then 3 END) as FINGERID_3, 
     SUM(case when FINGERID=4 then 4 END) as FINGERID_4, 
     SUM(case when FINGERID=5 then 5 END) as FINGERID_5, 
     SUM(case when FINGERID=6 then 6 END) as FINGERID_6, 
     SUM(case when FINGERID=7 then 7 END) as FINGERID_7, 
     SUM(case when FINGERID=8 then 8 END) as FINGERID_8, 
     SUM(case when FINGERID=9 then 9 END) as FINGERID_9, 
     SUM(case when FINGERID=10 then 10 END) as FINGERID_10, 
     SUM(case when FINGERID=11 then 11 END) as FINGERID_11, 
     SUM(case when FINGERID=12 then 12 END) as FINGERID_12, 
     SUM(case when FINGERID=13 then 13 END) as FINGERID_13, 
     SUM(case when FINGERID=14 then 14 END) as FINGERID_14 
     FROM TBLUSERFINGER group by userid;` 
+0

"집계가 필요하기 때문에 피벗을 선택하는 것이 좋지 않습니다": 집계를 사용하지 않는 이유는 무엇입니까? SUM이 합계가 아닙니다. – tbone

+0

현실에서'SUM'을 사용해야합니다. 왜냐하면 제 사례 문이'sum'없이 결과를 표시하지 않기 때문입니다 ... 나는 데이터를 아무런 수정없이 수평 적으로 만 원합니다. –

+0

I 출력물에서 어떤 것을 이해하지 못한다. 예를 들어, FINGERID_7_TEMPLATE, FINGERID_7_ISLOCKED 및 FINGERID_7_ISDUPLICATE 열이있을 것입니다. 그래도 FINGERID_7 열은 무엇입니까? 손가락 ID 자체는 7이며, 이는 열 이름으로 표시됩니다. 필자는 열에 FINGERID_7 열이 있어야한다고 생각하지 않지만 확실히하고 싶었습니다. 어느 쪽이든 조언 해주십시오. – mathguy

답변

2

이러한 데이터 유형은 문제를 일으 킵니다. 대신 LEFT JOIN 번을 사용할 수 있습니다.

select u.userid, 
     f1.fingerid as fingerid_1, 
     f1.template as fingerid_1_template, 
     f1.islocked as fingerid_1_islocked, 
     f1.isduplicate as fingerid_1_isduplicate, 
     . . . 
from (select distinct userid from TBLUSERFINGER) u left join 
    TBLUSERFINGER f1 
    on f1.userid = u.userid and f1.fingerid = 1 left join 
    TBLUSERFINGER f2 
    on f2.userid = u.userid and f2.fingerid = 2 left join 
    . . . 
    TBLUSERFINGER f14 
    on f14.userid = u.userid and f14.fingerid = 14 ; 
+0

고든 감사합니다. 피드백 =) –

+0

Gordon 고맙습니다. 2 주간의 고생 끝에 작동합니다.) ... 너무 많은 처리 시간이 필요하므로 4000,000 개의 결과가 표시됩니다. –

0

다른 접근 방법이 있습니다. 테이블이 매우 크고 그 자체에 여러 번 가입하는 것이 너무 느린 경우, blob을 제외하고 모든 것을 피벗시키고 그 자리에 blob을 찾을 수있는 rowid를 저장하십시오. 예를 들면 :

create table testx (
ROW_ID    NUMBER,   
USERID  NVARCHAR2(75) NOT NULL, 
TEMPLATE    BLOB  ,  
FINGERID  NVARCHAR2(20) NOT NULL, 
ISLOCKED    NUMBER(3)  , 
ISDUPLICATE   NUMBER(3) 
); 

create unique index testx_uidx on testx(userid, fingerid); 

-- insert some test data 
insert into testx values (1,'UID1',RAWTOHEX(UTL_RAW.CAST_TO_RAW('LOB1')),'1',1,0); 
insert into testx values (2,'UID1',RAWTOHEX(UTL_RAW.CAST_TO_RAW('LOB2')),'2',1,0); 
insert into testx values (3,'UID1',RAWTOHEX(UTL_RAW.CAST_TO_RAW('LOB3')),'3',0,0); 
insert into testx values (4,'UID2',RAWTOHEX(UTL_RAW.CAST_TO_RAW('LOB1')),'1',1,0); 
insert into testx values (5,'UID2',RAWTOHEX(UTL_RAW.CAST_TO_RAW('LOB2')),'2',1,0); 
insert into testx values (6,'UID2',RAWTOHEX(UTL_RAW.CAST_TO_RAW('LOB3')),'3',0,0); 
commit; 

-- pivot out what we can, show rowid to blob data 
select * from (
    select userid, rowid as template_rowid, fingerid,islocked,isduplicate 
    from testx 
) 
pivot ( 
    max(template_rowid) rowid_of_template, max(islocked) mislocked, max(isduplicate) misduplicate 
    for fingerid in ('1' fid1,'2' fid2,'3' fid3,'4' fid4,'5' fid5,'6' fid6,'7' fid7,'8' fid8,'9' fid9,'10' fid10,'11' fid11,'12' fid12,'13' fid13,'14' fid14) 
); 

출력 :

USERID,FID1_ROWID_OF_TEMPLATE,FID1_MISLOCKED,FID1_MISDUPLICATE,FID2_ROWID_OF_TEMPLATE,FID2_MISLOCKED,FID2_MISDUPLICATE,FID3_ROWID_OF_TEMPLATE,FID3_MISLOCKED,FID3_MISDUPLICATE,FID4_ROWID_OF_TEMPLATE,FID4_MISLOCKED,FID4_MISDUPLICATE,FID5_ROWID_OF_TEMPLATE,FID5_MISLOCKED,FID5_MISDUPLICATE,FID6_ROWID_OF_TEMPLATE,FID6_MISLOCKED,FID6_MISDUPLICATE,FID7_ROWID_OF_TEMPLATE,FID7_MISLOCKED,FID7_MISDUPLICATE,FID8_ROWID_OF_TEMPLATE,FID8_MISLOCKED,FID8_MISDUPLICATE,FID9_ROWID_OF_TEMPLATE,FID9_MISLOCKED,FID9_MISDUPLICATE,FID10_ROWID_OF_TEMPLATE,FID10_MISLOCKED,FID10_MISDUPLICATE,FID11_ROWID_OF_TEMPLATE,FID11_MISLOCKED,FID11_MISDUPLICATE,FID12_ROWID_OF_TEMPLATE,FID12_MISLOCKED,FID12_MISDUPLICATE,FID13_ROWID_OF_TEMPLATE,FID13_MISLOCKED,FID13_MISDUPLICATE,FID14_ROWID_OF_TEMPLATE,FID14_MISLOCKED,FID14_MISDUPLICATE 
"UID1","AAzWrKACUAAA1ffAAA",1,0,"AAzWrKACUAAA1ffAAB",1,0,"AAzWrKACUAAA1ffAAC",0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 
"UID2","AAzWrKACUAAA1ffAAD",1,0,"AAzWrKACUAAA1ffAAE",1,0,"AAzWrKACUAAA1ffAAF",0,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 

다음 필요에 따라 매우 빠르게 ROWID를 사용하여 (예를 들어, BLOB 이미지를 표시합니다) 조회를 할 수있는 응용 프로그램입니다.

+0

감사합니다. 의견을 보내 주시면 감사하겠습니다. .. –

관련 문제