我有一个表mapping
,其中包含code
列,其值如下所示。
A
B
C
D
我想将此行级数据转换为
列 column1 column2 column3 column4
A B C D
任何人都可以在这里帮忙。
此外,我不想在查询中硬编码我的表数据,因为数据可能每天都不同。
答案 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)
答案 2 :(得分:0)
使用PIVOT
:
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 |