Oracle實現動態行轉列

2021-09-25 19:31:26 字數 1217 閱讀 4593

oracle中要實現行轉列的方式有很多種,比如case when …else …end 、wm_concat()函式,lag() over() 、lead() over() 函式等,以及11g版本後的pivot函式都可實現。可根據具體的需求選取不同的方式。

前兩天恰好一朋友問起如何將如下表1動態轉成表2的形式。

表1

表2,channel_flag是查資料字典得到,值是變動的。當時第一反應是使用pivot函式。pivot函式語法是pivot(聚合函式 for 列名 in(型別))。嘗試了幾次,in後接子查詢均報錯,查資料得知若後接子查詢,只能使用pivot xml函式,顯然xml格式不符合需求。故最終選擇使用儲存過程來實現。最終的實現過程如下:

create or replace procedure p_tmp20190730  authid current_user is

v_sql varchar2(2000);

cursor cursor_1 is select distinct channel_flag from tmp20190730 order by channel_flag;

begin

v_sql := 'select prod_code';

for v_channel_flag in cursor_1

loop

v_sql := v_sql || ',' || 'max(decode(channel_flag,''' || v_channel_flag.channel_flag ||

''',isallow,null)) as ' || '"' || v_channel_flag.channel_flag || '"' ;

end loop;

v_sql := v_sql || ' from tmp20190730 group by prod_code';

dbms_output.put_line(v_sql);

v_sql := 'create table tmp_result as '|| v_sql;

execute immediate v_sql;

end;

tmp20190730為表1,最終結果tmp_result為表2.過程加

authid current_user防止出現執行儲存過程許可權不足。

動態行轉列 oracle環境

參考原文 練習示例 select s.stuid,max case s.subjectid when 101 then s.score else 0 end as 語文 max case s.subjectid when 102 then s.score else 0 end as 數學 max c...

動態行轉列

因狗血的報表展現需求 需要根據每天的新增使用者數量 選取前5個渠道.然後把該渠道當月每一天的新增使用者資料繪製在圖表上 x軸是 日期 y軸是新增使用者數量 畫5條線.這5條線是動態的,每天不同的線條.資料經過後台統計後形成表 statedate,channle id,channle name,new...

動態行轉列

drop table test create table test name varchar 12 scores int insert into test select 周杰倫 230 union select 周星馳 100 union select 成龍 150 union select 李連杰...