如何解决在Oracle中使用动态列进行数据透视
我是新的oracle数据库,下面有一个表格
ID Passengers Age Eligible
123456 Ben 65 Yes
123456 Mary 58 Yes
123458 Stephanie 37 Yes
123458 Aaron 32 Yes
123458 Caroline 18 No
我想获得动态列名称为Age1,Age2,Age3等的结果。
ID Age1 Age2 Age3
123456 65 58 NULL
123458 37 32 18
SQL Server
中的STUFF和Dynamic Pivot可以实现,但是我不知道如何在Oracle
中实现
任何人都可以指导我如何在Oracle
中动态进行操作
解决方法
为了获得动态生成的结果集(例如 Dynamic),可以使用存储函数(例如使用PL / SQL代替直接使用SQL )中的
ą̃
透视
SYS_REFCURSOR
我还添加了乘客的姓名,以便区分每个数据。
然后运行以下代码:
CREATE OR REPLACE FUNCTION get_passengers_rs RETURN SYS_REFCURSOR IS
v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_str VARCHAR2(32767);
BEGIN
SELECT LISTAGG('MAX(CASE WHEN rn = '||lvl||' THEN age||''(''||passengers||'')'' END)
AS "Age'||lvl||'"',',') WITHIN GROUP (ORDER BY 0)
INTO v_str
FROM ( SELECT level AS lvl
FROM dual
CONNECT BY level <= (SELECT MAX(COUNT(*)) FROM t GROUP BY ID ) ) t;
v_sql :=
'SELECT ID,'|| v_str ||'
FROM
(
SELECT t.*,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY 0) AS rn
FROM t
)
GROUP BY ID';
OPEN v_recordset FOR v_sql;
RETURN v_recordset;
END;
从SQL Developer的命令行中查看期望的结果集。
上面的代码为当前现有数据生成此SQL字符串( v_sql )
VAR rc REFCURSOR
EXEC :rc := get_passengers_rs;
PRINT rc
产生
SELECT ID,MAX(CASE WHEN rn = 1 THEN age||'('||passengers||')' END) AS "Age1",MAX(CASE WHEN rn = 2 THEN age||'('||passengers||')' END) AS "Age2",MAX(CASE WHEN rn = 3 THEN age||'('||passengers||')' END) AS "Age3"
FROM
(
SELECT t.*,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY 0) AS rn
FROM t
)
GROUP BY ID
作为结果集。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。