2015-07-06 3 views
0

У меня есть следующие имена таблиц ETEST с col1 и col2 как имена столбцов.преобразование столбца в строку

col1 col2 
    ==== ==== 
    eid 101 
    name abc 
    age 30 
    eid 102 
    name xyz 
    age 40 

Значение Иды, имя и может повторяться, я хочу написать запрос SQL, чтобы отобразить данные, как показано ниже:

eid name age 
101 abc 30 
102 xyz 40  

Я пытался что-то вроде ниже, но это не работает для всех записей ,

SELECT MAX(DECODE(a.col1,'eid',a.col2)) eid, 
    MAX(DECODE(a.col1,'name',a.col2)) name , 
    MAX(DECODE(a.col1,'age',a.col2)) age 
FROM 
    (SELECT rownum, 
    last_value(col1 ignore nulls) over (order by rownum) col1, 
    last_value(col2 ignore nulls) over (order by rownum) col2 
    FROM etest 
    ORDER BY rownum 
)a; 

Пожалуйста, обратите внимание, что может быть п число записей для Ид, имя и возраст в col1 из приведенной выше таблицы.

Пожалуйста, помогите. С уважением, MKS

+2

Ваша структура базы данных не имеет смысла, как мы можем знать, что «xyz» относится к «102», а не «101»? На этой таблице должен быть другой столбец. – davegreen100

+0

Как я упоминал ранее, соответствующие значения для eid, имени и возраста должны быть выбраны с помощью запроса sql. – MKS

+1

извините, все еще не понимаю, что логика говорит, что «xyz» должен показать «101»?, Это чисто порядок строк в таблице? если это так, то вы находитесь в куче неприятностей. – davegreen100

ответ

1

Самый элегантный способ перезаписи столбцов в строки использует инструкцию pivot. Такой код будет выглядеть примерно так:

select * 
    from etest 
    pivot 
    (min(col2) 
    for col1 in ('eid', 'name', 'age') 
    ) 

Но я согласен с прежним утверждением: конструкция базы данных сомнительна. Вы никогда не можете быть уверены, что выбранный eid в одной строке принадлежит другому name или age в другой строке. Таким образом, это решение предлагается только на полпути.

Смежные вопросы