首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

在oracle中有没有方式来实现这样的统计啊?

2014-01-28 
在oracle中有没有方式来实现这样的统计?有这样的三张表,记录表(id,compid 单位编号,happentime 发生时间,pr

在oracle中有没有方式来实现这样的统计

有这样的三张表,记录表(id,compid 单位编号,happentime 发生时间,protypeid 问题类型),问题类型表(proid,……),单

位表(compid单位编号,compname单位名称)。
要做一下三种统计:
一:统计某一时间段内某单位不同问题的汇总情况
选择好具体单位,起始时间、截止时间
生成一下这样的结果:

时间  问题1  问题2  问题3
2002(起始时间)  2  4  6
2003  6  8  1
2004(截止时间)  6  8  9
即统计一个单位在一个时间段内每年对应的问题类型的发生个数。

二:统计某一时间段内各单位不同问题的汇总情况
选择好起始时间、截止时间

生成这样的统计结果:

单位  问题1  问题2  问题3
单位1  2  3  6 
单位2  4  5  7

即统计不同单位在这段时间内对应的每种问题发生个数

三:针对某个问题,统计某一时间段内各年度的汇总情况
选择开始时间、截止时间、问题分类

生成以下这样结果:
单位  2002以前  2003 2004
单位1  12  4  23
单位2  29  3  12
即统计每个单位在这个时间段内每年某具体问题的发生情况


原来的做法是通过代码来设计好相应的datatable,然后在这个datatable里添加列,最后手动添加每条记录。这种方法比较死板,而且速度慢,因为每条记录的每个属性的值都是统计出来的。

在oracle中有没有方式来实现这样的统计啊?
原先考虑过在oracle中生成临时表来做,原理和写代码设计datatable差不多。
如果在oracle中做,是不是要写些比较复杂的存储过程?

------解决方法--------------------------------------------------------
1 select happentime,sum(decode(protypeid,'问题1',1)),sum(decode(protypeid,'问题2',1)),sum(decode(protypeid,'问题3',1)) from 表  where compid=*** group by happentime(如果时间包含年月日 ,则你按哪个分组就用SUBSTR去截断再GROUP)
2, select B.compname,sum(decode(protypeid,'问题1',1)),sum(decode(protypeid,'问题2',1)),sum(decode(protypeid,'问题3',1)) from 记录表 A inner join 单位表 B
on  A.compid=B. compid  group by B.compname
3,  select B.compname,
sum
(case when
A.happentime <2002
then 1
else
0 end ),sum
(case when
A.happentime =2003
then 1
else
0 end ),sum
(case when
A.happentime =2004
then 1
else
0 end ) from 记录表 A inner join 单位表 B
on  A.compid=B. compid  group by B.compname

好久没写SQL了,可能一俩个语法弄错一点 你自己调一下
------解决方法--------------------------------------------------------