对下面这段SQL语句SELECT 
       nvl(round(avg(AVG_DEAL_TIME), 1), 0) as SHEET_AVEPROTIME,
       nvl(round(max(MAX_DEAL_TIME), 1), 0) as SHEET_MAXPROTIME,
       nvl(round(min(MIN_DEAL_TIME), 1), 0) as SHEET_MINPROTIME
  FROM (SELECT 
               T.SEND_FLAG,
               T.DEAL_FLAG,
               ROUND(AVG(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) AVG_DEAL_TIME,
               ROUND(MAX(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) MAX_DEAL_TIME,
               ROUND(MIN(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) MIN_DEAL_TIME
          FROM (SELECT *
                  FROM PG_J_SHEET
                 WHERE CREATE_DATE BETWEEN
                       TO_DATE('2010-08-01 00:00:00', 'YYYY-MM-DD HH24:Mi:SS') AND
                       TO_DATE('2010-08-07 23:59:59', 'YYYY-MM-DD HH24:Mi:SS')) T
         GROUP BY T.SEND_FLAG,
                  T.DEAL_FLAG) G我在外层计算平均时间,最大时间以及最短时间时,如何根据T.DEAL_FLAG来过滤数据,比如,当T.DEAL_FLAG为9的时候,子查询计算出的AVG_DEAL_TIME,MAX_DEAL_TIME和MIN_DEAL_TIME就不计入计算范围。
在线等答案
谢谢

解决方案 »

  1.   

    SELECT 
           nvl(round(avg(AVG_DEAL_TIME), 1), 0) as SHEET_AVEPROTIME,
           nvl(round(max(MAX_DEAL_TIME), 1), 0) as SHEET_MAXPROTIME,
           nvl(round(min(MIN_DEAL_TIME), 1), 0) as SHEET_MINPROTIME
      FROM (SELECT 
                   T.SEND_FLAG,
                   T.DEAL_FLAG,
                   case when T.DEAL_FLAG<>9 then ROUND(AVG(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) else 0 end  AVG_DEAL_TIME,
                   case when T.DEAL_FLAG<>9 then ROUND(MAX(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) else 0 end  MAX_DEAL_TIME,
                   case when T.DEAL_FLAG<>9 then ROUND(MIN(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) else 0 end  MIN_DEAL_TIME
              FROM (SELECT *
                      FROM PG_J_SHEET
                     WHERE CREATE_DATE BETWEEN
                           TO_DATE('2010-08-01 00:00:00', 'YYYY-MM-DD HH24:Mi:SS') AND
                           TO_DATE('2010-08-07 23:59:59', 'YYYY-MM-DD HH24:Mi:SS')) T
             GROUP BY T.SEND_FLAG,
                      T.DEAL_FLAG) G
      

  2.   

    谢谢2楼的,但是结果不正确,在里面过滤的话,到了外层,对于存在T.DEAL_FLAG=9的工单,最短时间就全部变为0了,这是不符合实际的。
    之前我也用decode在子查询进行过滤试过了,不可行,所以,应该只能从外层过滤
      

  3.   

    SELECT *
                      FROM PG_J_SHEET
                     WHERE CREATE_DATE BETWEEN
                           TO_DATE('2010-08-01 00:00:00', 'YYYY-MM-DD HH24:Mi:SS') AND
                           TO_DATE('2010-08-07 23:59:59', 'YYYY-MM-DD HH24:Mi:SS')
    在这里把 DEAL_FLAG = 9 的直接去掉不更直接
      

  4.   


    因为我外层还要统计T.DEAL_FLAG=9的数据啊,呵呵
      

  5.   

    现在问题解决了,确实是用case when,但是,这里当T.DEAL_FLAG=9的时候,需将其值设为null,而不是设为0,如此一来,我在外层再进行平均、求最大和最小值的计算的时候,null值不参与运算,就不会出错了。
    而且,我的语句的计算思路本身有点问题,我在里面按照一定的条件分组,然后计算出了平均值,我在外层再根据分组条件中的某一个条件再分组并求平均值的时候,直接使用avg肯定是不对的,假设其中一组的平均值是2,另一组的平均值是4,因为每个组的组员个数不同,这样计算出的平均值就是3,而实际上平均值很可能不是3.后来,我将里面的第一个修改为求和,然后在外层也求和,再除以不为空的成员的个数,得到的平均值就是正确的了。