Как преобразовать столбцы в строки в Oracle?

У меня есть таблица в этой форме (это всего лишь частичный вид, таблица содержит более 100 столбцов).

LOAN NUMBER DOCUMENT_TYPE DOCUMENT_ID 992452533663 Voters ID XPD0355636 992452533663 Pan card CHXPS5522D 992452533663 Drivers licence DL-0420110141769 

Для одного номера кредита у меня есть три вида документов в качестве доказательства. Я хочу, чтобы эти данные были преобразованы в столбцы и имеют следующую форму:

 LOAN NUMBER VOTERS_ID PAN_CARD DRIVERS LICENCE 992452533663 XPD0355636 CHXPS5522D DL-0420110141769 

Как это сделать?

Вы можете сделать это с помощью pivot запроса , например:

 select * from ( select LOAN_NUMBER, DOCUMENT_TYPE, DOCUMENT_ID from my_table t ) pivot ( MIN(DOCUMENT_ID) for DOCUMENT_TYPE in ('Voters ID','Pan card','Drivers licence') ) 

Вот демонстрация на sqlfiddle.com .

Если вы используете Oracle 10g, вы можете использовать функцию DECODE для поворота строк в столбцы:

 CREATE TABLE doc_tab ( loan_number VARCHAR2(20), document_type VARCHAR2(20), document_id VARCHAR2(20) ); INSERT INTO doc_tab VALUES('992452533663', 'Voters ID', 'XPD0355636'); INSERT INTO doc_tab VALUES('992452533663', 'Pan card', 'CHXPS5522D'); INSERT INTO doc_tab VALUES('992452533663', 'Drivers licence', 'DL-0420110141769'); COMMIT; SELECT loan_number, MAX(DECODE(document_type, 'Voters ID', document_id)) AS voters_id, MAX(DECODE(document_type, 'Pan card', document_id)) AS pan_card, MAX(DECODE(document_type, 'Drivers licence', document_id)) AS drivers_licence FROM doc_tab GROUP BY loan_number ORDER BY loan_number; 

Вывод:

  LOAN_NUMBER VOTERS_ID PAN_CARD DRIVERS_LICENCE    
 ------------- -------------------- ----------------- --- --------------------
 992452533663 XPD0355636 CHXPS5522D DL-0420110141769 

Вы можете добиться того же, используя предложение Oracle PIVOT , введенное в 11g:

 SELECT * FROM doc_tab PIVOT ( MAX(document_id) FOR document_type IN ('Voters ID','Pan card','Drivers licence') ); 

Пример SQLFiddle с обоими решениями: пример SQLFiddle

Подробнее о повороте здесь: Pivot In Oracle от Tim Hall

  select * FROM doc_tab PIVOT ( Min(document_id) FOR document_type IN ('Voters ID','Pan card','Drivers licence') ) 

outputs as this

введите описание изображения здесь

Демо-версия sql скрипта здесь