如何解决具有总列的动态行到列转换
表名:样本数据
id | State_Assign
-----------------
a10 | FL
a11 | AL
a11 | PH
a12 | MA
a12 | GL
我是 oracle 的新手,我尝试过 Pivot 但正在寻找动态解决方案,状态分配的数量是动态的,对于 a11 id,今天可以为 2,但明天可以更改为 3。 附上需要的输出截图 谢谢!
解决方法
基本上你可以使用这样一个包含条件聚合逻辑的静态解决方案
SELECT id,MAX(CASE WHEN rn = 1 THEN State_Assign END) AS sa1,MAX(CASE WHEN rn = 2 THEN State_Assign END) AS sa2,.......
.......
COUNT(*) AS total
FROM (SELECT s.*,ROW_NUMBER() OVER (PARTITION BY id ORDER BY 0) AS rn
FROM sampledata s)
GROUP BY id
ORDER BY id
可能会创建一个存储函数来生成选择语句,该语句将根据表的当前值产生动态结果,例如
CREATE OR REPLACE FUNCTION Get_Pivoted_States RETURN SYS_REFCURSOR IS
v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_cols VARCHAR2(32767);
BEGIN
SELECT LISTAGG('MAX(CASE WHEN rn = '||rn||' THEN State_Assign END) AS sa'||rn,',')
WITHIN GROUP (ORDER BY 0)
INTO v_cols
FROM (SELECT DISTINCT ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS rn
FROM sampledata);
v_sql :='SELECT id,'|| v_cols ||',COUNT(*) AS total
FROM (SELECT s.*,ROW_NUMBER() OVER (PARTITION BY id ORDER BY 0) AS rn
FROM sampledata s)
GROUP BY id
ORDER BY id';
OPEN v_recordset FOR v_sql;
DBMS_OUTPUT.PUT_LINE(v_sql);
RETURN v_recordset;
END;
/
该函数可能会从 SQL Developer 的控制台调用为
SQL> DECLARE
result SYS_REFCURSOR;
BEGIN
:result := Get_Pivoted_States;
END;
/
SQL> PRINT result;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。