web-dev-qa-db-ja.com

Oracleで行を列に変換する方法

このフォームにテーブルがあります(これは単なる部分ビューで、テーブルには100を超える列が含まれています)。

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

単一のローン番号について、証拠として3種類の文書があります。これらの詳細を列に変換し、次の形にしたいです。

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

これをどうやってやるの?

9
MontyPython

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 

11gで導入されたOracle PIVOT句を使用して同じことを実現できます。

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

両方のソリューションを使用したSQLFiddleの例: SQLFiddle example

ピボットの詳細については、こちらをご覧ください。 Tim HallによるOracleのピボット

8

pivot query で次のようにできます:

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のデモ です。

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

outputs as this

enter image description here

ここでSQLフィドルデモ

6
vhadalgi