如何在Oracle sql中将行转换为按多列分组的列[关闭]
Posted
技术标签:
【中文标题】如何在Oracle sql中将行转换为按多列分组的列[关闭]【英文标题】:How to convert rows to columns group by multiple columns in Oracle sql [closed] 【发布时间】:2020-09-11 18:11:40 【问题描述】:我有一个表格,数据如下:
a | b | c | d
a | b | c | e
a | b | c | f
g | h | i | j
g | h | i | k
g | h | i | l
我想将数据转换如下:
a | b | c | d | e | f
g | h | i | j | k | l
尝试如下。但它没有用。
select col1, col2, col3,
rtrim(xmlagg(xmlelement(e, col4 || ',')).extract ('//text()'), ',') val
from TABLEA
group by col1, col2, col
你能帮我解决这个问题吗?
【问题讨论】:
由于表中的行没有以任何特定方式排序(即使在查看它们时它们可能似乎是有序的),不清楚您是如何决定的d
应该放在第四列,e
在第五列,f
在最后一列。你怎么决定呢?或者你不在乎 - 任何订单都可以?
那么:对于前三列的每一个不同组合,输入中是否总是恰好有三个不同的行(导致恰好需要另外三列)?如果前三列中具有相同三个值的行数可以变化,那么问题甚至没有意义 - 您需要澄清要求,因为在关系数据库中,输出中的所有行都必须具有列数相同。
【参考方案1】:
您可以使用row_number()
枚举前三列中具有相同值的行,然后使用条件聚合进行透视。
假设列被称为c1
到c4
:
select c1, c2, c3,
max(case when rn = 1 then c4 end) c41,
max(case when rn = 2 then c4 end) c42,
max(case when rn = 3 then c4 end) c43
from (
select t.*, row_number() over(partition by c1, c2, c3 order by c4) rn
from mytable t
) t
group by c1, c2, c3
【讨论】:
以上是关于如何在Oracle sql中将行转换为按多列分组的列[关闭]的主要内容,如果未能解决你的问题,请参考以下文章