在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了,可能一俩个语法弄错一点 你自己调一下
------解决方法--------------------------------------------------------