2017-01-09 53 views
0

行分列轉換數據的列DB2

我有一個行,而不是列(天知道這是爲什麼。因爲它是由客戶端處理,我不能改變表。)

存儲數據的表

數據看起來像這樣

CUSTDATA 
-------- 
IdentificaitonId 
FirstName 
LastName 
MiddleName 

的樣本數據

CUSTDATA 
-------- 
PID4587 
FNAME1 
LNAME1 
MNAME1 
PID4589 
FNAME2 
LNAME2 
PID4959 
FNAME3 
LNAME3 
MNAME3 

IdentificaitonId總是啓動與'PID',例如PID4587。第一個和最後一個名字是強制性的,所以它永遠不會是NULL或爲空。

有沒有什麼辦法可以查詢該表以下的輸出:

IdentificaitonId  FirstName LastName MiddleName 
PID4587    FNAME1  LNAME1  MNAME1 
PID4589    FNAME2  LNAME2  
PID4959    FNAME3  LNAME3  MNAME3 
+0

你怎麼知道'FNAME1'和'LNAME1'屬於'PID4587'而不是一些其他的ID? – mustaccio

+0

另外,您如何確保按照您期望的順序出現行? – mustaccio

+0

@mustaccio把它當成一個給定的,PID458總是跟着First和Last的名字。中間是可選的,所以它對某些PID不存在 – uSeruSher

回答

0

我得到了它終於來了!

與allrows如(
選擇csdata.custdata,通過RRN ROWNUMBER()以上(順序(csdata))ROWNO 從CUSTDATA csdata

選擇custdata,
(從allrows b其中ROWNO選擇custdata = a.ROWNO + 1)
作爲FIRST_NAME,
(從allrows b。選擇所需custdata其中ROWNO = a.ROWNO + 2)
作爲LAST_NAME,
(子串時選擇的情況下(custdata,1,3)=' PID'然後爲NULL
其他custdata結束
從allrows b,其中ROWNO = a.ROWNO + 3)
作爲MIDDLE_NAME
從allrows一個

0

嘗試這樣的事情

with allpid as(
select f1.custdata, rownumber() over(order by rrn(f1)) rang 
from yourlib.yourtable f1 where f1.custdata like 'PID%' 
) 
select f1.custdata as IdentificaitonId, f2.custdata as FirstName, 
f3.custdata as LastName, f4.custdata as MiddleName 
from allpid f1 
left outer join yourlib.yourtable f2 on f2.custdata = 'FNAME' || f1.rang 
left outer join yourlib.yourtable f3 on f3.custdata = 'LNAME' || f1.rang 
left outer join yourlib.yourtable f4 on f4.custdata = 'MNAME' || f1.rang 
+0

BTW當你用where子句添加rrn()時,它將首先應用where子句,然後獲得RRN,所以在這種情況下,臨時表的PID和行號爲1,2,3等。 – uSeruSher