如何解决使用Sql Developer Oracle进行动态数据透视查询
初学者学生
NAME School Class
John Hs English
Steve Hs Maths
Matthew Hs Science
Jim Hs History
需要的输出:我需要查询从初始表中自动提取Name列数据并将其更改为输出中的列标题,并且由于名称将不断变化,因此我无法使用简单的数据透视查询来对名称进行硬编码。我是轮换查询的新手,所以我想询问是否有人可以帮助我。谢谢。
School John Steve Matthew Jim
Hs English Maths Science History
这是我尝试的内容:*注意(我正在尝试在Oracle Sql Developer中使用此查询以实现输出格式)
declare
sqlqry clob;
cols clob;
begin
select listagg('''' || NAME || ''' as "' || NAME || '"',',') within group (order by NAME)
into cols
from (select distinct NAME from Students);
sqlqry :=
'
select * from(select NAME,SCHOOL,CLASS from Students)
pivot(MAX(CLASS) FOR NAME IN (' || cols || ')
)';
execute immediate sqlqry;
end;
解决方法
您步入正轨,但如果为至少一名学生定义了一个以上的班级,那么该案例将失败。内部的ROW_NUMBER()
分析功能可以解决问题。因此,创建一个包含SYS_REFCURSOR
的存储函数:
CREATE OR REPLACE FUNCTION get_student_rs RETURN SYS_REFCURSOR IS
recordset SYS_REFCURSOR;
sqlqry VARCHAR2(32767);
cols VARCHAR2(32767);
BEGIN
SELECT LISTAGG(''''||name||''' AS "'||name||'"',',') WITHIN GROUP (ORDER BY 0)
INTO cols
FROM ( SELECT DISTINCT name FROM Students );
sqlqry :=
'SELECT *
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY 0) AS rn,s.*
FROM Students s
)
PIVOT (
MAX(class) FOR name IN ('||cols||')
)
ORDER BY rn';
OPEN recordset FOR sqlqry;
RETURN recordset;
END;
/
假设再插入一条记录;
Name School Class
---- ------ -------
Jim Hs History
然后调用
VAR rc REFCURSOR
EXEC :rc := get_student_rs;
PRINT rc
从 SQL Developer 的命令行中可以看到结果集:
RN SCHOOL Jim John Matthew Steve
-- ------ ------- ------- ------- ------
1 Hs Maths English Science Maths
2 Hs History
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。