2010-07-28 4 views
9

Мне нужно написать запрос, который принимает строки и преобразует его в столбцы - вот мой стол:Преобразование столбцов в строки в SQL

Count fname lname id 
----------------------------- 
1  abc  def 20 
2  pqr   20  
3  abc  xyz 20 
4  xyz  xyz 20 
1  abc  def 21 
1  pqr  xyz 22 
2  abc  abc 22 

Это выход я пытаюсь произвести:

id fname lname fname lname fname lname fname lname 
------------------------------------------------------------- 
20 abc def pqr NULL abc xyz xyz xyz 
21 abc def NULL NULL NULL NULL NULL NULL 
22 abc abc NULL NULL NULL NULL NULL NULL 

Максимальное значение count для каждого идентификатора - 4. Я использую Oracle 9i.

ответ

1

Я знаю, что вы после решения Oracle 9i, но Oracle 11 вводит PIVOT, что позволяет делать запросы, как:

select * 
    from mb_test 
pivot (max(fname) as fname, 
     max(lname) as lname 
    for count in (1,2,3,4) 
     ) 
order by id 
; 

, который дает:

ID 1_fname 1_lname 2_fname 2_lname 3_fname 3_lname 4_fname 4_lname 
20 abc  def  pqr  null  abc  xyz  xyz  xyz 
21 abc  def  null  null  null  null  null  null 
22 pqr  xyz  abc  abc  null  null  null  null 

Не совсем то, чем вы были, но очень полезно во многих обстоятельствах ... и почти стоили обновления только для PIVOT и UNPIVOT

EDIT

Модифицированный положить имя_файла и LName в отдельных колонках

+0

Как и в вопросе расшифровывает, Fname и LNAME должны быть отдельные столбцы ... – ThinkJet

+0

Результаты запроса и образца, –

1

Посмотрите на этот пример, тот же принцип, что и в М. @ Mike ответ, но с истинной реализации Oracle:

create table my_table (
    id number, 
    fname varchar2(255), 
    lname varchar2(255), 
    cnt number 
); 

    insert into my_table(cnt, fname, lname, id) values(1,'abc','def',20); 
    insert into my_table(cnt, fname, lname, id) values(2,'pqr','' ,20);  
    insert into my_table(cnt, fname, lname, id) values(3,'abc','xyz',20); 
    insert into my_table(cnt, fname, lname, id) values(4,'xyz','xyz',20); 
    insert into my_table(cnt, fname, lname, id) values(1,'abc','def',21); 
    insert into my_table(cnt, fname, lname, id) values(1,'pqr','xyz',22); 
    insert into my_table(cnt, fname, lname, id) values(2,'abc','abc',22); 

    select 
    tbl.id, 
    min(decode(tbl.cnt, 1 , fname, null)) fname_1, 
    min(decode(tbl.cnt, 1 , lname, null)) lname_1, 
    min(decode(tbl.cnt, 2 , fname, null)) fname_2, 
    min(decode(tbl.cnt, 2 , lname, null)) lname_2, 
    min(decode(tbl.cnt, 3 , fname, null)) fname_3, 
    min(decode(tbl.cnt, 3 , lname, null)) lname_3, 
    min(decode(tbl.cnt, 4 , fname, null)) fname_4, 
    min(decode(tbl.cnt, 4 , lname, null)) lname_4 
    from 
    my_table tbl 
    group by 
    tbl.id 
    order by 
    tbl.id 
    ; 
2

Вот еще один, с которым вам повезло. Мне нравится @ Thinkjet, но не уверен, сколько стоит (если больше или меньше, чем это ниже.

SELECT 
    T1.ID, 
    T1.fname, 
    T1.lname, 
    T2.fname, 
    T2.lname, 
    T3.fname, 
    T3.lname, 
    T4.fname, 
    T4.lname 
FROM 
     table T1 
    LEFT JOIN 
     table T2 
    ON 
     T1.ID = T2.ID 
     AND T2.count = 2 
    LEFT JOIN 
     table T3 
    ON 
     T1.ID = T3.ID 
     AND T3.count = 3 
    LEFT JOIN 
     table T4 
    ON 
     T1.ID = T4.ID 
     AND T4.count = 4 
WHERE 
    T1.count = 1