2017-01-09 2 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' и не какой-то другой идентификатор? – mustaccio

+0

Также, как вы гарантируете, что строки выходят в том порядке, в котором вы их ожидаете? – mustaccio

+0

@mustaccio Рассматривайте это как заданное, PID458 всегда сопровождается именем First и Last. Среднее значение является необязательным, поэтому его нет для некоторых PID – uSeruSher

ответ

0

Я получил его, наконец!

с allrows как (
выберите csdata.custdata, RowNumber() по (порядка по RRN (csdata)) из Ровно CUSTDATA csdata
)
выберите custdata,
(выбрать custdata из allrows В, где Ровно = a.ROWNO + 1)
, как FIRST_NAME,
(выберите custdata из allrows б, где = a.ROWNO Ровно + 2)
, как LAST_NAME,
(выберите случай, когда подстроки (custdata, 1,3) = ' PID ', затем NULL
еще custdata конец
из allrows б где = 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 Когда вы добавляете rrn() с предложением where, он сначала применит предложение where, а затем получит RRN, поэтому в этом случае временная таблица с PID и номерами строк как 1,2,3 и т. Д. – uSeruSher