如何在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() 枚举前三列中具有相同值的行,然后使用条件聚合进行透视。

假设列被称为c1c4

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中将行转换为按多列分组的列[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:多列转多行

SQL中的Group By的查询过程多列分组的查询过程是怎样的?

sql中如何把具体日期转化为按月排序?

如何使用数据透视在 Oracle 中将行转换为列

如何在大查询中将数组转换为多列

在 ORACLE SQL 中将一组列转换为行