Oracle中如何将行转换为列?
我有一个这种形式的表格(这只是部分视图,表格包含 100 多列).
I have a table in this form (this is just the partial view, the table contains more than 100 columns).
LOAN NUMBER DOCUMENT_TYPE DOCUMENT_ID
992452533663 Voters ID XPD0355636
992452533663 Pan card CHXPS5522D
992452533663 Drivers licence DL-0420110141769
一个贷款号,我有三种文件作为证明.我希望将这些详细信息转换为列并采用以下形状:
For a single loan number, I have three kinds of documents as proof. I want these details to be converted into columns and take the following shape:
LOAN NUMBER VOTERS_ID PAN_CARD DRIVERS LICENCE
992452533663 XPD0355636 CHXPS5522D DL-0420110141769
如何解决这个问题?
推荐答案
如果您使用的是 Oracle 10g,则可以使用 DECODE
函数将行转为列:
If you are using Oracle 10g, you can use the DECODE
function to pivot the rows into columns:
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
子句实现相同的目的:
You can achieve the same using Oracle PIVOT
clause, introduced in 11g:
SELECT *
FROM doc_tab
PIVOT (
MAX(document_id) FOR document_type IN ('Voters ID','Pan card','Drivers licence')
);
带有两种解决方案的 SQLFiddle 示例:SQLFiddle 示例
SQLFiddle example with both solutions: SQLFiddle example
在此处阅读有关透视的更多信息:透视蒂姆·霍尔的甲骨文
Read more about pivoting here: Pivot In Oracle by Tim Hall
相关文章