大家好,有个问题想请教下,我用的是Oracle数据库,需求如下:
假设我有张表DetectionRate(缺陷率),表里有字段Error(缺陷),CjQty(抽检数量),NotOKQty(不合格数),Tdate(时间)。
如何去实现:假设日期从2009-01-01至2010—01-01这段时间内(这个时间段是可变的,也就是某个时间段内),日期间隔N天,查询出Error(缺陷)的不合格率。
这里的日期间隔N天是这样解释的,就是说以上时间段内(2009-01-01至2010—01-01),假设日期间隔是10天,也就是说2009—01—01至2009—01—10这个时间段内Error(缺陷)
的不合格率(不合格数/抽检数),以此类推2009—01—11至2009—01—20,2009—01—21至2009—01—30.我建张表好理解一点,如下表:
假设初始表:
  Error         CjQty    NotOKQty      Tdate
装配件错误       300        5         2009-01-01
装配件错误       350        7         2009-01-05
装配件错误       400        8         2009-01-10
装配件错误       400        2         2009-01-15
装配件错误       350        5         2009-01-20按需求得到后的表是:  Error          Rate            Mdate
装配件错误      20/1050     2009-01-01至2009-01-10
装配件错误      7/750       2009-01-11至2009-01-20这个不合格率就是在日期间隔interval内,总的不合格数/总的抽检数*100%,以上的Rate为了显示效果没算出百分率来。总的来说就是有三个参数,
日期自dateFrom,日期至dateTo,日期间隔interval来写个存储过程,希望大家能帮小弟个忙,刚学存储过程不是很熟悉,谢谢大家了!

解决方案 »

  1.   

    大概就这个样子declare
      fromDate date;
      toData   date;
      interval number(10);
    begin
      insert into afterTable
        select *
          from table1
         where tdate between fromDate and toDate
           and fromDate - toDate < interval 
    end;
      

  2.   

    感谢你的回答,我感觉好像不对
    select *
          from table1
         where tdate between fromDate and toDate
           and fromDate - toDate < interval 只能查询到表中的数据,不能够整合数据
      

  3.   

    整合你不就sum(NotOKQty)/sum(CjQty)可以了??
      

  4.   

    是按日期间隔来划分的,sum函数我知道,难就难在把日期划分为一段一段来显示出来
      

  5.   

    这个存储过程肯定需要循环才能够实现的,我举例的只是一小部分数据,就像个for循环,但存储过程刚学不知道如何入手,有高手帮忙解答吗?再次感谢楼上几位
      

  6.   

    应该差不多象这样吧,'2009-01-01'是起始日期,'2009-07-05'是终止日期,10是间隔
    也许在取整这里还得再调整下SELECT ERROR,
           TO_DATE('2009-01-1', 'yyyy-mm-dd') + (AA - 1) * 10 自,
           TO_DATE('2009-01-1', 'yyyy-mm-dd') + AA * 10 至,
           BB,
           CC
      FROM (SELECT ERROR,
                   CEIL((TDATE - TO_DATE('2009-01-01', 'yyyy-mm-dd') + 1) / 10) AA,
                   SUM(NOTOKQYT) BB,
                   SUM(CJQTY) CC
              FROM RATE
             WHERE TDATE BETWEEN TO_DATE('2009-01-01', 'yyyy-mm-dd') AND
                   TO_DATE('2009-07-05', 'yyyy-mm-dd')
             GROUP BY ERROR,
                      CEIL((TDATE - TO_DATE('2009-01-01', 'yyyy-mm-dd') + 1) / 10));
      

  7.   


    create or replace procedure getRate(datebegin date,dateend date,interval integer,RESULT OUT sys_refcursor) is
    begin
    OPEN RESULT FOR
      SELECT ERROR,
           datebegin + (AA - 1) * interval 自,
           datebegin + AA * interval 至,
           BB,
           CC
      FROM (SELECT ERROR,
                   CEIL((TDATE - datebegin + 1) / interval) AA,
                   SUM(NOTOKQYT) BB,
                   SUM(CJQTY) CC
              FROM RATE
             WHERE TDATE BETWEEN datebegin AND
                   dateend
             GROUP BY ERROR,
                      CEIL((TDATE - datebegin + 1) / interval));
    end getRate;