我不知道如何在Oracle 11g中动态地将列值转换为行,请提供帮助。
我在屏幕截图中附加了输入和预期输出值。
这里rollno是每行的uniq值,基于rollno,可以将不同的标记填充到列中[它可以动态地或最多5列,如图中所示],并且需要填充不同的类值[可以动态填充或最多5列]
答案 0 :(得分:0)
在这种情况下,我不认为你真的想要一个支点。特别是因为您似乎没有marks
和class
的所有群组共享的具体列。看起来你真正想要的是这个信息列出了很好,整齐排成一行。在这种情况下,您应该使用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