如何将行转换为Oracle中的列?

Mon*_*hon 10 sql oracle pivot

我有一个这种形式的表(这只是局部视图,该表包含100多列).

 LOAN NUMBER   DOCUMENT_TYPE                DOCUMENT_ID
 992452533663  Voters ID                    XPD0355636
 992452533663  Pan card                     CHXPS5522D
 992452533663  Drivers licence              DL-0420110141769
Run Code Online (Sandbox Code Playgroud)

对于单个贷款号码,我有三种文件作为证据.我希望将这些细节转换为列并采用以下形状:

LOAN NUMBER     VOTERS_ID    PAN_CARD     DRIVERS LICENCE
992452533663    XPD0355636   CHXPS5522D   DL-0420110141769
Run Code Online (Sandbox Code Playgroud)

怎么去这个?

das*_*ght 13

您可以使用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')
)
Run Code Online (Sandbox Code Playgroud)

这是sqlfiddle.com上的一个演示.


Prz*_*lej 9

如果您使用的是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;
Run Code Online (Sandbox Code Playgroud)

输出:

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

使用PIVOT11g中引入的Oracle 子句可以实现相同的目的:

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

两个解决方案的SQLFiddle示例: SQLFiddle example

阅读更多关于在这里进行数据透视的信息:在Tim Hall的Oracle中进行透视

  • @MontyPython我已经为您提供了适用于Oracle 10g和11g的解决方案.由于您没有编写Oracle版本,因此我提供了适用于这两种版本的解决方案.由dasblinkenlight使用的`PIVOT`是在Oracle 11g中引入的,在11g之前的版本中不可用. (3认同)

vha*_*lgi 7

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

outputs as this

在此处输入图片说明

sql小提琴演示在这里