各位大哥們,小弟現在遇到一個难题,我的表的结构是这样的,
    D_FLG1 -- D_FLG24   NUMBER(10,0),
    DAT1   -- DAT24     NUMBER(10,0),
D_FLG1代表一个标记,DAT1代表数据,这个表存的是这二十四小时的数据,我现在需要计算比如从1点到10点的数据,需要把DAT1到DAT10数据累加起来除以10,
但是这个数据是要根据这个D_FLG标记来计算的,如果D_FLG标记这是一条无效的数据,那么不做为累加的数据。
举个例子,从一点到5点的数据,三点的数据无效,那么就应该是(DAT1+DAT2+0+DAT4+DAT5)/4,
请教各位如何在sql中实现这样的呢,谢谢各位了。

解决方案 »

  1.   

    select sum(DAT)/count(*) from (
      select D_FLG1 as D_FLG, DAT1 as DAT from table where ...
      union all
      select D_FLG2 as D_FLG, DAT2 as DAT from table where ...
      union all
      ...
    )where D_FLG...
      

  2.   

    楼主参考一下:
    SQL> select * from flag;      FLAG       DATA
    ---------- ----------
             2        100
             2        100
             2        100
             2        100
             1        100
             2        105
             2        105
             1        100
             1        100
             2        100已选择10行。flag=2表示有效;
    flag=1表示无效.
    rownum是你要取的小时数,你也可以改为区间形式。SQL> select sum(data*decode(flag,2,1,1,0,1))/sum(decode(flag,2,1,1,0,1)) result from flag where rownum<=4;    RESULT
    ----------
           100SQL> select sum(data*decode(flag,2,1,1,0,1))/sum(decode(flag,2,1,1,0,1)) result from flag where rownum<=7;    RESULT
    ----------
    101.666667SQL> select sum(data*decode(flag,2,1,1,0,1))/sum(decode(flag,2,1,1,0,1)) result from flag where rownum<=10;    RESULT
    ----------
    101.428571