2017-10-11 23 views
2

大家好我有下表,它是由一個可怕的開發人員設計的如何在沒有聚合的情況下將這些行轉換爲Oracle中的列?

該表包含USERS指紋和他們的USERID的數據。 的FINGERID值從(1,2,3,4,5,6,7,8,9,10,11,12,13,14)ISLOCKEDISDUPLICATE和值是10 ...每個FINGERID已存儲在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) 

有像我想要顯示它,因爲2周水平的方式,但沒有運氣...以下是我的select語句

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) 

我曾嘗試使用這種期望的結構代碼但沒有運氣,因爲我無法顯示TEMPLATEBLOB),ISLOCKEDISDUPLICATED 每個FINGERID,因爲它不會與group by工作,pivot是不是一個很好的選擇,因爲它需要聚集......我只是想要顯示的數據只是它是如何的,但在每個水平方式用戶名 。

`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

「數據透視不是一個好的選擇,因爲它需要聚合」:爲什麼不使用任何聚合?不是你的總和? – tbone

+0

我被迫在現實中使用'SUM'我不需要它,因爲我的case語句不會顯示沒有'sum'的結果......我只是想讓我的數據在水平上沒有任何編輯 –

+0

我不明白你輸出的內容。例如,您將擁有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

謝謝戈登它在2周的痛苦後工作:)...它需要很多處理時間來看到4000,000行結果 –

0

下面是另一種方法。如果你的桌子非常大,並且多次連接到它自己的速度太慢,你可以將除blob之外的所有東西都擺出來,將rowid存儲在可以找到blob的地方。例如:

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。

+0

謝謝我會嘗試並給你反饋。 .. –

相關問題