【问题标题】:Oracle 11g Rows into Columns DynamicallyOracle 11g 动态行成列
【发布时间】:2017-06-22 04:10:13
【问题描述】:

我不知道如何在 Oracle 11g 中将列值动态转换为行,请帮助解决这个问题。

我在屏幕截图中附加了输入值和预期输出值。

这里 rollno 是每一行的唯一值,基于 rollno,可以将不同的标记填充到列中[它可能是动态的或最多 5 列,如图所示],同样需要填充不同的类值 [可以动态填充或最多填充 5 列]

【问题讨论】:

  • 很遗憾,这不能完全按原样解决。你没有足够清楚地指定你的约束。具体来说,在 rollno 101 下,是什么让标记 101 和标记 1 成为 104?为什么那里没有marks2?它们必须位于不同的列中,还是只需位于按 rollno 分组的单行上?
  • 我想我知道你真正想要的是什么。看我的回答。如果我关闭,我会相应地调整它。
  • 嗨 Sandiper,我已经更新了需求中的约束,请帮助解决这个问题
  • 我仍然会引导您找到我的答案。问题是marks1、marks2等没有任何意义。您刚刚将它们排成一排。没有什么是独一无二的,这意味着在第二行中,marks2 将始终为 104。如果您有其他值,则 104 将向右移动。这使得 PIVOT 成为一个糟糕的应用程序。
  • 你应该回答的更深层次的问题是为什么你需要在不同的列中使用这些?

标签: sql oracle oracle11g pivot-table


【解决方案1】:

在这种情况下,我认为您并不真正想要一个支点。特别是因为您似乎没有marksclass 的所有组共享的具体列。看来您真正想要的是这些信息整齐有序地列在一行中。在这种情况下,您应该使用 LISTAGG() 函数。试试这个:

SELECT rollno, 
       LISTAGG(marks, ', ') WITHIN GROUP (ORDER BY marks) AS marks_list,
       LISTAGG(class, ', ') WITHIN GROUP (ORDER BY class) AS class_list
FROM my_table
GROUP BY rollno
ORDER BY rollno

更多关于 LISTAGG() 的信息可以在here找到。

【讨论】:

    【解决方案2】:

    下面的查询给出了预期的结果

    与 T1 AS(

    选择 ROLLNO

     , (select listagg(column_value, ',') within group (order by column_value ASC) from table(collect_col2)) as marks_list
    
    
    
    
     , (select listagg(column_value, ',') within group (order by column_value ASC) from table(collect_col3)) as class_list
    

    来自

    (select ROLLNO, collect(distinct MARKS) as collect_col2 , collect(distinct CLASS) as collect_col3 from STUDENT group by ROLLNO))

    SELECT rollno,REGEXP_SUBSTR(marks_list, '([^,])(,|$)', 1, 1,NULL,1) 标记1,REGEXP_SUBSTR(marks_list, '([^,])(,|$)', 1, 2,NULL,1) 标记2,REGEXP_SUBSTR(marks_list, '([^,])(,|$)', 1, 3,NULL,1) 标记3, REGEXP_SUBSTR(marks_list, '([^,])(,|$)', 1, 4,NULL,1) 标记4,

    REGEXP_SUBSTR(marks_list, '([^,])(,|$)', 1, 5,NULL,1) 标记5,REGEXP_SUBSTR(marks_list, '([^,])( ,|$)', 1, 6,NULL,1) 标记6,REGEXP_SUBSTR(class_list, '([^,])(,|$)', 1, 1,NULL,1) class1,REGEXP_SUBSTR(class_list , '([^,])(,|$)', 1, 2,NULL,1) class2,

    REGEXP_SUBSTR(class_list, '([^,]*)(,|$)', 1, 3,NULL,1) class3,

    REGEXP_SUBSTR(class_list, '([^,]*)(,|$)', 1, 4,NULL,1) class4,

    REGEXP_SUBSTR(class_list, '([^,]*)(,|$)', 1, 5,NULL,1) class5

    从 T1 开始

    【讨论】:

      猜你喜欢
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多