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;
参考oracle行转列(动态行转不定列)
拼接出SQL语句来执行
你这样写好像没有设备类型的名称吧?
给列加别名我觉得应该是动态的行转列,写成静态的SQL语句肯定不行。#4的兄弟的确实有参考价值。
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语句本身就应该在前端完成。再者,如果采用第二种方式,当多个进程同时执行的时候,就可能会产生冲突出错
你这样写好像没有设备类型的名称吧?
给列加别名我觉得应该是动态的行转列,写成静态的SQL语句肯定不行。#4的兄弟的确实有参考价值。那你就用动态的,我又没说一定要这样写