效果图:
左边是转前数据,行数不确定。 右边是转后数据,列数不确定。
主要分3步
--1-----------------------创建存储过程-------------------------
CREATE OR REPLACE PROCEDURE P_TEST IS
--定义变量 拼接语句
V_SQL VARCHAR2(2000);
--查询出所有需要装换成列的行数据
CURSOR CURSOR_1 IS SELECT DISTINCT T.CODE FROM TEST_TABLE T order by T.CODE;
BEGIN
--开始拼接SQL
V_SQL := 'SELECT NAME';
--循环游标 拼接动态列
FOR V_CODE IN CURSOR_1
LOOP
V_SQL := V_SQL || ',' || 'MIN(DECODE(CODE,''' || V_CODE.CODE ||
''',VALUE)) AS ' || V_CODE.CODE;
END LOOP;
--拼接SQL 对需要显示的列进行分组
V_SQL := V_SQL || ' FROM TEST_TABLE GROUP BY NAME';
--输出拼接的查询SQL
DBMS_OUTPUT.PUT_LINE(V_SQL);
--拼接成视图,方便查询
V_SQL := 'CREATE OR REPLACE VIEW V_TEST AS '|| V_SQL;
--输出创建视图的语句
DBMS_OUTPUT.PUT_LINE(V_SQL);
--执行创建视图
EXECUTE IMMEDIATE V_SQL;
END;
--2-- ----------------执行存储过程,生成视图----------------------------
BEGIN
P_TEST;
END;
--3------------------查询视图-----------------------------------------
SELECT * FROM V_TEST T;