现在用帆软 做报表,涉及到周报,这个sql该怎么写表名:ALARM_HISTROY
这个表里有这么几个关键字段,BUILD_CODE,DEVICE_CODE,ALARM_TIME每一条记录表示,每个DEVICE_CODE在时间ALARM_TIME时候产生了一条告警记录(ALARM_TIME
到秒级)而每一个BUILD_CODE包含最多256个DEVICE_CODE(这个表把关联放到一起了,不考虑是否合理)现在要做的是,按照所选的开始时间begin和结束时间end,在这个时间段内,按照周,统计给定的BUILD_CODE每一周里所产生的告警次数
比如 所选begin为2011-02-02,end为2012-02-08
begin的一周是从2010/01/31(周日)到2011/02/05(周六)   
end的一周是从2010/02/06(周日)到2011/02/12(周六)  格式:时间                             楼宇                  次数
2010/01/31-2011/02/05            0001                    25
2010/02/06-2011/02/12            0001                    25

解决方案 »

  1.   


    ----try it
    select trunc(ALARM_TIME, 'd') || '-' || trunc(ALARM_TIME, 'd') + 7,
           BUILD_CODE,
           count(DEVICE_CODE)
      from LARM_HISTROY
     group by trunc(ALARM_TIME, 'd'), BUILD_CODE;
      

  2.   

    ---测试数据如下SQL> 
    SQL> with LARM_HISTROY as
      2  (
      3  select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-01-31' ALARM_TIME from dual union all
      4  select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-01' ALARM_TIME from dual union all
      5  select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-02' ALARM_TIME from dual union all
      6  select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-03' ALARM_TIME from dual union all
      7  select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-04' ALARM_TIME from dual union all
      8  select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-05' ALARM_TIME from dual union all
      9  select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-06' ALARM_TIME from dual union all
     10  select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-07' ALARM_TIME from dual union all
     11  select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-08' ALARM_TIME from dual union all
     12  select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-09' ALARM_TIME from dual union all
     13  select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-10' ALARM_TIME from dual union all
     14  select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-11' ALARM_TIME from dual
     15  )
     16  select trunc(ALARM_TIME, 'd') || '-' || (trunc(ALARM_TIME, 'd') + 7),
     17         BUILD_CODE,
     18         count(DEVICE_CODE)
     19    from LARM_HISTROY
     20   group by trunc(ALARM_TIME, 'd'), BUILD_CODE;TRUNC(ALARM_TIME,'D')||'-'||(T BUILD_CODE COUNT(DEVICE_CODE)
    ------------------------------ ---------- ------------------
    30-1月 -11-06-2月 -11          0001                        6
    06-2月 -11-13-2月 -11          0001                        6
      

  3.   

    CREATE PROCEDURE P_TEST
    (
    v_beg_date DATE,
    v_end_Date DATE
    ) IS
    V_DATE NUMBER;
    --结果表rpt_res
    BEGIN
    --判断2个时间是否处在同一星期
    SELECT v_beg_date - v_end_Date
    INTO   V_DATE
    FROM   dual;
    --如果大于7说明不在同一周期有2条结果
    IF v_date >= 7 THEN
    INSERT INTO rpt_res
    SELECT BUILD_CODE,
       COUNT(DEVICE_CODE)
    FROM   LARM_HISTROY
    WHERE  ALARM_TIME >= trunc(v_beg_date, 'D')
    AND    ALARM_TIME < trunc(v_beg_date, 'D') + 7
    GROUP  BY BUILD_CODE;
    UNION ALL
    SELECT BUILD_CODE,
       COUNT(DEVICE_CODE)
    FROM   LARM_HISTROY
    WHERE  ALARM_TIME >= trunc(v_end_Date, 'D')
    AND    ALARM_TIME < trunc(v_end_Date, 'D') + 7
    GROUP  BY BUILD_CODE;
    COMMIT;
    END IF;
    --如果小于7则在同一星期自由一条结果
    IF v_date < 7 THEN
    INSERT INTO rpt_res
    SELECT BUILD_CODE,
       COUNT(DEVICE_CODE)
    FROM   LARM_HISTROY
    WHERE  ALARM_TIME >= trunc(v_beg_date, 'D')
    AND    ALARM_TIME < trunc(v_beg_date, 'D') + 7
    GROUP  BY BUILD_CODE;
    END IF;END;
      

  4.   

    建议加入 begin、end 2个字段,这样方便报表查询。
    例如,结合查询参数(开始-结束日期)
        week_begin between trunc(开始日期,'d') and trunc(结束日期,'d')主要的问题,在如何按周统计。 上面已经给出解决方案,查询,就是小case 了。
      

  5.   


    万分感谢,现在的时间是依据ALARM_TIME这个来排的周,如果某一周没有这个数据,那这一周就缺省了,无法显示那有没有办法按照传入的开始时间 结束时间这个时间段内所有周的数据,也就是缺省的周让他为0