Oracle动态行转列—存储过程实现

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;

查询视图的结果:Oracle动态行转列—存储过程实现

查询视图result:

select * from result;