Oracle动态行转列—存储过程实现
Oracle动态行转列—存储过程实现
原表结构如下:
需求:
需要把部门里面每个JOB的合计薪水统计,比如部门
deptno clerk manager ………..
10 0 2450
解决:
写一个存储过程动态去拼接列
CREATE OR REPLACE PROCEDURE E_TEST IS
V_SQL VARCHAR2(2000);
--游标获取所有列 即所有的job
CURSOR CURSOR_1 IS SELECT DISTINCT T.JOB FROM EMP T ORDER BY JOB;
BEGIN
--拼接查询sql
V_SQL := 'SELECT deptno';
--遍历游标拼接列
FOR V_XCLCK IN CURSOR_1
LOOP
--动态拼接列 并对相同部门相同职位的薪水求和
V_SQL := V_SQL || ',' || 'SUM(DECODE(JOB,''' || V_XCLCK.JOB ||
''',sal,0)) AS ' || V_XCLCK.JOB;
END LOOP;
--拼接查询分组条件
V_SQL := V_SQL || ' FROM EMP GROUP BY deptno ORDER BY deptno';
--把查询到的创建为视图
V_SQL := 'CREATE OR REPLACE VIEW RESULT AS '|| V_SQL;
--DBMS_OUTPUT.PUT_LINE(V_SQL);
EXECUTE IMMEDIATE V_SQL;
END;
查询视图的结果:
查询视图result:
select * from result;