sql - 在oracle中将行数据转换为列
问题描述
我有一个表,其中包含如下所示的mapping
列和值。code
A
B
C
D
我想将此行级数据转换为列
column1 column2 column3 column4
A B C D
任何人都可以在这里帮忙。
此外,我不想在查询中对我的表数据进行硬编码,因为数据可能每天都不同。
解决方案
如果您想要一个为您提供可变列数的查询,则一种方法可能是动态 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)
推荐阅读
- android - Kotlin - 缩放画布性能问题
- r - 循环遍历数据框时如何引用同一行中的元素?
- c# - 在启动时访问 dbcontext
- android - Android WebView和html透明背景
- sql - 哪种商店类型按销售金额和销售数量销售的产品最多
- python - 从numpy中的图像中提取缩略图
- sap-cloud-sdk - 构建失败,例如应用程序 cloud-s4-sdk-book(集成测试)
- python-3.x - Python:如何将 json 逗号分隔键转换为字典
- dialogflow-es - Dialogflow 后续意图未在 Actions on Google 上触发
- oracle - Oracle Apex 交互式网格 - 使用只读方式保存不正确的记录