select d.dep_name,
       sum(case when t.equip_type = 1 then 1 else 0 end), 
           sum(case when t.equip_type=2 then 1 else 0 end), 
           sum(case when t.equip_type=3 then 1 else 0 end),
           sum(case when t.equip_type=4then 1 else 0 end)
  from equip_INFO t, dep_info d
 where t.equip_dep = d.dep_id
 group by d.dep_name;

解决方案 »

  1.   

    借助视图实现
    参考oracle行转列(动态行转不定列)
      

  2.   

    把 下面的语句,估成 动态的            sum(case when t.equip_type=3 then 1 else 0 end),
      

  3.   

    以二楼的为模板,在程序中根据类型表TYPE_INFO来拼出 case end部分
    拼接出SQL语句来执行
      

  4.   

    写个过程,用游标循环读取type_info表记录,以2#为模板拼sql,记得还有列别名。
      

  5.   

    不能用一条SQL直接获得,只能通过动态SQL拼接
      

  6.   


    你这样写好像没有设备类型的名称吧?

    给列加别名我觉得应该是动态的行转列,写成静态的SQL语句肯定不行。#4的兄弟的确实有参考价值。
      

  7.   

    这个问题其实不难,两个方法
    1是在程序中,通过设备类型表循环拼接出sql语句,例如DECLARE
    v_sql VARCHAR2(4000);
    BEGIN
      v_sql:='select di.dep_name';
      FOR x IN(SELECT * FROM type_info ORDER BY type_id)LOOP
        v_sql:=v_sql||CHR(10)||',count(case when ei.equip_type='||x.type_id||' then 1 end) as "'||x.type_name||'"';
      END LOOP;
      v_sql:=v_sql||CHR(10)||'from dep_info di,equip_info ei where di.dep_id=ei.equip_dept(+)'
        ||chr(10)||'group by di.dep_id,di.dep_name'
        ||CHR(10)||'order by di.dep_id';
      dbms_output.put_line(v_sql);
    END;
        
    这是个拼接sql语句的Oracle存储过程,将这个逻辑换成前端的程序代码即可2是在数据库中,写一个存储过程,和上面的类似,只不过将dbms_output输出语句换成创建视图的语句。然后前端调用视图
    和前一种方式相比,代码的复杂度是差不多的,但是不推荐这种用法
    因为拼接sql语句本身就应该在前端完成。再者,如果采用第二种方式,当多个进程同时执行的时候,就可能会产生冲突出错
      

  8.   


    你这样写好像没有设备类型的名称吧?

    给列加别名我觉得应该是动态的行转列,写成静态的SQL语句肯定不行。#4的兄弟的确实有参考价值。那你就用动态的,我又没说一定要这样写