求一个交差报表的语句写法

灵雨飘零 2015-03-06 11:27:58
有三个表:部门表DEP_INFO、设备类型表:TYPE_INFO、设备信息表:EQUIP_INFO,根据三个表的数据,做一个交差报表。表数据都是动态的。如下所示,请问如何写查询语句??


...全文
535 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
IceIsabel 2015-03-11
  • 打赏
  • 举报
回复
引用 11 楼 kingboy2008 的回复:
[quote=引用 10 楼 IceIsabel 的回复:] [quote=引用 9 楼 kingboy2008 的回复:] [quote=引用 2 楼 IceIsabel 的回复:]

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;
你这样写好像没有设备类型的名称吧? [/quote] 给列加别名[/quote] 我觉得应该是动态的行转列,写成静态的SQL语句肯定不行。#4的兄弟的确实有参考价值。[/quote] 那你就用动态的,我又没说一定要这样写
小灰狼W 2015-03-11
  • 打赏
  • 举报
回复
这个问题其实不难,两个方法 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语句本身就应该在前端完成。再者,如果采用第二种方式,当多个进程同时执行的时候,就可能会产生冲突出错
灵雨飘零 2015-03-11
  • 打赏
  • 举报
回复
引用 9 楼 kingboy2008 的回复:
[quote=引用 2 楼 IceIsabel 的回复:]

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;
你这样写好像没有设备类型的名称吧? [/quote] 而且这样写我觉得不会所有的部门列出来。如果数据库中没有这个部门的数据,那应该各种类型都是0.
灵雨飘零 2015-03-11
  • 打赏
  • 举报
回复
引用 10 楼 IceIsabel 的回复:
[quote=引用 9 楼 kingboy2008 的回复:] [quote=引用 2 楼 IceIsabel 的回复:]

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;
你这样写好像没有设备类型的名称吧? [/quote] 给列加别名[/quote] 我觉得应该是动态的行转列,写成静态的SQL语句肯定不行。#4的兄弟的确实有参考价值。
IceIsabel 2015-03-11
  • 打赏
  • 举报
回复
引用 9 楼 kingboy2008 的回复:
[quote=引用 2 楼 IceIsabel 的回复:]

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;
你这样写好像没有设备类型的名称吧? [/quote] 给列加别名
灵雨飘零 2015-03-11
  • 打赏
  • 举报
回复
引用 2 楼 IceIsabel 的回复:

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;
你这样写好像没有设备类型的名称吧?
binsweet 2015-03-09
  • 打赏
  • 举报
回复
不能用一条SQL直接获得,只能通过动态SQL拼接
  • 打赏
  • 举报
回复
写个过程,用游标循环读取type_info表记录,以2#为模板拼sql,记得还有列别名。
小灰狼W 2015-03-09
  • 打赏
  • 举报
回复
以二楼的为模板,在程序中根据类型表TYPE_INFO来拼出 case end部分 拼接出SQL语句来执行
IceIsabel 2015-03-06
  • 打赏
  • 举报
回复

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;

灵雨飘零 2015-03-06
  • 打赏
  • 举报
回复
自己占沙发!!
卖水果的net 2015-03-06
  • 打赏
  • 举报
回复
把 下面的语句,估成 动态的            sum(case when t.equip_type=3 then 1 else 0 end),
bw555 2015-03-06
  • 打赏
  • 举报
回复
灵雨飘零 2015-03-06
  • 打赏
  • 举报
回复
引用 2 楼 IceIsabel 的回复:

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;

部门和类型表数据是动态的。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧