如何解决动态 Pivot N 行到 N 列
我想将多行转换成列 我找到了以下代码
我的问题是,我可以在表中存储过程输出吗?
来自这个链接 https://asktom.oracle.com/pls/apex/f?p=100:11:::::P11_QUESTION_ID:4471013000346257238
代码
create table fish (
fish_id number,fish_type varchar2(3),fish_weight number);
insert into fish values (1,'COD',20);
insert into fish values(1,'HAD',30);
insert into fish values(2,45);
insert into fish values(2,'HKE',10);
insert into fish values(2,'LIN',55);
insert into fish values(3,'CTY',90);
insert into fish values (3,60);
insert into fish values (3,52);
/
create or replace procedure go_fishing( p_cursor in out sys_refcursor )
as
l_query long := 'select fish_id';
begin
for x in (select distinct fish_type from fish order by 1 )
loop
l_query := l_query ||
replace( q'|,sum(decode(fish_type,'$X$',fish_weight)) $X$|',dbms_assert.simple_sql_name(x.fish_type) );
end loop;
l_query := l_query || ' from fish group by fish_id order by fish_id';
open p_cursor for l_query;
end;
/
解决方法
您可以通过在存储函数(或过程)中使用 SYS_REFCURSOR
来动态旋转数据,例如
CREATE OR REPLACE FUNCTION Get_Fish_Weight_ByType RETURN SYS_REFCURSOR IS
v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_cols VARCHAR2(32767);
BEGIN
SELECT LISTAGG( ''''||fish_type||''' AS "'||fish_type||'"',',' )
WITHIN GROUP ( ORDER BY fish_type )
INTO v_cols
FROM ( SELECT DISTINCT fish_type
FROM fish );
v_sql :='SELECT *
FROM fish e
PIVOT
(
MAX(fish_weight) FOR fish_type IN ( '|| v_cols ||' )
)';
OPEN v_recordset FOR v_sql;
DBMS_OUTPUT.PUT_LINE(v_sql);
RETURN v_recordset;
END;
/
生成并运行以下 Select 语句
SELECT *
FROM fish e
PIVOT
(
MAX(fish_weight) FOR fish_type IN ( 'COD' AS "COD",'CTY' AS "CTY",'HAD' AS "HAD",'HKE' AS "HKE",'LIN' AS "LIN" )
)
Demo for the produced SQL statement
然后从 SQL Developer 的控制台调用创建的函数
SQL> DECLARE
res SYS_REFCURSOR;
BEGIN
:res := Get_Fish_Weight_ByType;
END;
/
SQL> PRINT res;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。