首页 > 解决方案 > oracle中的行到列

问题描述

我有两个结果集的案例,我需要将它们合并为一个结果集。多次进行各种查询以获得所需的输出但失败了。

这些是结果集。

select drc.rc_column_name from dyna_report_columns drc;

列名

select * from REPORT1;

在此处输入图像描述

我想要做的是将结果从rc_column_name不同的列作为单行获取到下一个结果集。

像这样的东西。 在此处输入图像描述

标签: sqloracle

解决方案


我正计划使报告充满活力”

您需要一个可以处理任意数量的列的解决方案。所以你不能这样做是一个常规查询。您需要使用动态 SQL 来动态组装投影。

这意味着执行动态 SQL 语句并返回弱引用游标的存储过程或函数。同样,它必须是一个引用游标,因为这是唯一可以处理可变投影的构造。引用游标与 JDBC ResultSet 和 ODBC ResultSet 以及大多数常见前端编程语言中的等效项兼容。

这是一个使用您发布的表格的功能:

create or replace function get_any_report return sys_refcursor
is
    stmt varchar2(32767);
    rc sys_refcursor;
begin
    select 'select 1 as row_type, ' || 
            listagg(''''||rc_column_name||''' as col'||trim(to_char(rc_seq)), ',') within group (order by rc_seq)
            ||' from dual'
    ||' union all   
    select 2  as row_type, r1.*
    from report1 r1
    order by 1, 2'
    into stmt        
    from dyna_report_columns ;
    dbms_output.put_line(stmt);

    open rc for stmt;

    return rc;
end;
/

ORDER BY 子句中引用了一个附加列row_type,以保证标题行是结果集的第一行。


这是一个 Oracle LiveSQL 演示。抱歉,您需要一个免费的 Oracle 帐户来运行它,但 SQL Fiddle 目前有点不稳定。


这是演示的 SQL Fiddle 版本,但 Fiddle 不支持 DBMS_OUTPUT。


推荐阅读