有三个表
task表     task_id   task_date    task_name   task_state
bmxx表     dept_id    dept_name
fpxx表     rec_id    task_id   dept_id   fp_hk现在想得到如下的交叉表
 部门名称     部门任务数     1月   2月  3月  4月  5月  6月  7月  8月  9月  10月  11月  12月 
  部门1
  部门2
  部门3
  部门4 就是不管fpxx表中有没有这个部门的任务,都要在交叉表中显示出来

解决方案 »

  1.   

    行转列的通用过程
    create or replace procedure proc(tabname in varchar2,
                                      col1 in varchar2,
                                      col2 in varchar2,
                                      col3 in varchar2,
                                      viewname in varchar2 default 'v_tmp')
    as
      sqlstr varchar2(2000):='create or replace view '||viewname||' as select '||col1||' ';
      c1 sys_refcursor;
      v1 varchar2(100);
    begin
      open c1 for 'select distinct to_char('||col2||') from '||tabname;
      loop
        fetch c1 into v1;
        exit when c1%notfound;
        sqlstr:=sqlstr||'
      ,max(decode('||col2||','''||v1||''','||col3||'))"'||v1||'"';
      end loop;
      close c1;
      sqlstr:=sqlstr||' from '||tabname||' group by '||col1;
      execute immediate sqlstr;
    end proc;
      

  2.   

    行列转换使用decode,case函数,很多的,自己搜一下