将行数据转换为oracle中的列

时间:2018-06-01 07:43:51

标签: sql oracle

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

A
B
C
D

我想将此行级数据转换为

column1 column2 column3 column4

A B C D

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

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

3 个答案:

答案 0 :(得分:1)

如果您希望查询提供可变数量的列,则可以使用动态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)

答案 1 :(得分:0)

检查以下查询。

select listagg(CODE,' ') within group(order by CODE) CODE
from tableName

选中此Demo

答案 2 :(得分:0)

使用PIVOT

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE mapping ( code ) AS
SELECT 'A' FROM DUAL UNION ALL
SELECT 'B' FROM DUAL UNION ALL
SELECT 'C' FROM DUAL UNION ALL
SELECT 'D' FROM DUAL;

查询1

SELECT *
FROM   (
  SELECT ROW_NUMBER() OVER ( ORDER BY code ) rn,
         code
  FROM   mapping
)
PIVOT ( MAX( code ) FOR rn IN (
  1 AS column1,
  2 AS column2,
  3 AS column3,
  4 AS coumn4
) )

<强> Results

| COLUMN1 | COLUMN2 | COLUMN3 | COUMN4 |
|---------|---------|---------|--------|
|       A |       B |       C |      D |