2017-01-09 59 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