首页 > 解决方案 > 在oracle中将行数据转换为列

问题描述

我有一个表,其中包含如下所示的mapping列和值。code

A
B
C
D

我想将此行级数据转换为列

column1 column2 column3 column4

A B C D

任何人都可以在这里帮忙。

此外,我不想在查询中对我的表数据进行硬编码,因为数据可能每天都不同。

标签: sqloracle

解决方案


如果您想要一个为您提供可变列数的查询,则一种方法可能是动态 SQL;例如,此查询将构建一个完成这项工作的查询,无论记录数如何:

select 
        'select *
        from
            mapping
        pivot ( max(code) for code in (' ||
        listagg('''' || code || ''' AS column' || n, ',') within group (order by code) ||
        '))'
from (select code, rownum n from mapping)

这给出了这个查询:

select *
from
    mapping
pivot ( max(code) for code in ('A' AS column1,'B' AS column2,'C' AS column3,'D' AS column4))

这使:

COLUMN1 COLUMN2 COLUMN3 COLUMN4
------- ------- ------- -------
A       B       C       D      
1 row selected.

现在的问题是你将如何使用它;您可以使用 运行动态查询execute immediate,但在这里您事先不知道列数,因此您无法将此查询的结果获取到任何内容中。

另一种方法是生成 XML 结果,例如:

select 
        dbms_xmlgen.getxml(
            'select *
            from
                mapping
            pivot ( max(code) for code in (' ||
            listagg('''' || code || ''' AS column' || n, ',') within group (order by code) ||
            '))'
        )

给出:

<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <COLUMN1>A</COLUMN1>
  <COLUMN2>B</COLUMN2>
  <COLUMN3>C</COLUMN3>
  <COLUMN4>D</COLUMN4>
 </ROW>
</ROWSET>
from (select code, rownum n from mapping)

推荐阅读