Oracle 11g动态地进入列

时间:2017-06-22 04:10:14

标签: sql oracle oracle11g pivot-table

我不知道如何在Oracle 11g中动态地将列值转换为行,请提供帮助。

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

enter image description here

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

2 个答案:

答案 0 :(得分:0)

在这种情况下,我不认为你真的想要一个支点。特别是因为您似乎没有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

答案 1 :(得分:0)

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

WITH 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

来自

(选择ROLLNO,收集(不同的MARKS)作为collect_col2,通过ROLLNO从STUDENT组收集(不同的CLASS)为collect_col3))

SELECT rollno,REGEXP_SUBSTR(marks_list,'([^,] )(,| $)',1,1,NULL,1)marks1,REGEXP_SUBSTR(marks_list,&#39 ;([^,] )(,| $)',1,2,NULL,1)marks2,REGEXP_SUBSTR(marks_list,'([^,] )(, | $)',1,3,NULL,1)marks3,REGEXP_SUBSTR(marks_list,'([^,] )(,| $)',1,4, NULL,1)marks4,

REGEXP_SUBSTR(marks_list,'([^,] )(,| $)',1,5,NULL,1)marks5,REGEXP_SUBSTR(marks_list,'([ ^,] )(,| $)',1,6,NULL,1)marks6,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

FROM T1