【问题标题】:How to convert rows to columns group by multiple columns in Oracle sql [closed]如何在Oracle sql中将行转换为按多列分组的列[关闭]
【发布时间】: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 在最后一列。你怎么决定呢?或者你不在乎 - 任何订单都可以?
  • 那么:对于前三列的每一个不同组合,输入中是否总是恰好有三个不同的行(导致恰好需要另外三列)?如果前三列中具有相同三个值的行数可以变化,那么问题甚至没有意义 - 您需要澄清要求,因为在关系数据库中,输出中的所有行都必须具有列数相同。

标签: sql oracle pivot oracle12c window-functions


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2020-07-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多