初用oracle,pl/sql语句如下:select '2012-09-18' 日期,lyjzm,TO_CHAR(sum(jzll),'99999999999.9') 井排液量,TO_CHAR(sum(jzyl),'99999999999.9') 井排油量
  from ys_dhb12 t where zm='利津联合站'
 and 
 ((rq=to_date('2012-09-17','yyyy-MM-dd') and cjsj in('10:00','12:00','14:00','16:00','18:00','20:00','22:00')) or (rq=to_date('2012-09-18','yyyy-MM-dd') and cjsj in('0:00','2:00','4:00','6:00','8:00')))
 and (lyjzm='注采站' or exists(select 1 from YS_DHA14 where zm=t.lyjzm and zb='11')) group by lyjzm这个是查询某一天的产量,我想改成循环查询当月每天的产量,请问如何改啊

解决方案 »

  1.   

    for i in startDate .. endDate LOOP
    begin
    select i 日期,lyjzm,TO_CHAR(sum(jzll),'99999999999.9') 井排液量,TO_CHAR(sum(jzyl),'99999999999.9') 井排油量
      from ys_dhb12 t where zm='利津联合站'
     and  
     ((rq=to_date(i-1,'yyyy-MM-dd') and cjsj in('10:00','12:00','14:00','16:00','18:00','20:00','22:00')) or (rq=to_date(i,'yyyy-MM-dd') and cjsj in('0:00','2:00','4:00','6:00','8:00')))
     and (lyjzm='注采站' or exists(select 1 from YS_DHA14 where zm=t.lyjzm and zb='11')) group by lyjzm
    end;
      

  2.   

    --写成月份循环比较麻烦,你需要去判断是否闫年,判断月份才能得到确定的循环次数,考虑指定月份查询。
    SELECT TO_CHAR(rq,'yyyy-mm-dd') --'2012-09-18' 日期,
      lyjzm,
      TO_CHAR(SUM(jzll),'99999999999.9') 井排液量,
      TO_CHAR(SUM(jzyl),'99999999999.9') 井排油量
    FROM ys_dhb12 t
    WHERE zm ='利津联合站'
      /*
      AND ((rq  =to_date('2012-09-17','yyyy-MM-dd')
      AND cjsj IN('10:00','12:00','14:00','16:00','18:00','20:00','22:00'))
      OR (rq    =to_date('2012-09-18','yyyy-MM-dd')
      AND cjsj IN('0:00','2:00','4:00','6:00','8:00')))
      */
    AND to_date(rq
      || cjsj
      || ':00','yyyy-mm-dd hh24:mi:ss') BETWEEN to_date(rq
      || '10:00:00','yyyy-mm-dd hh24:mi:ss')
    AND to_date((rq +1)
      || '08:00:00','yyyy-mm-dd hh24:mi:ss')--取值范围=当天10点至第二天8点
    and mod(to_char(to_date(cjsj,'hh24:mi'),'hh'),2) = 0 --每两小时的整点
    and to_char(rq,'yyyy-mm') = '2012-09'--指定月份
    AND (lyjzm='注采站'
    OR EXISTS
      (SELECT 1 FROM YS_DHA14 WHERE zm=t.lyjzm AND zb='11'
      ))
    GROUP BY lyjzm
    order by rq --按日期排序
      

  3.   

    可以用下面的方式 
    while 条件 loop
    ......
    end loop;
      

  4.   

    用trunc(sysdate,'mm')得到本月的第一天,
    用last_date(sysdate)得到本月的最后一天,
    然后写个循环就好
      

  5.   


    --按照你的sql表达的意思就是,当天的10:00以后-到第二天8点之前 每两个小时的总量算做一天的
    --不用循环呀兄弟,找出分组规律就ok了哦
    SELECT TO_CHAR(RQ + 14 / 24, 'YYYY-MM-DD') 日期,
           --这个分组在rq的基础上加了14个小时,那么自然前一天的10:00之后的数据显示的就是下一天
           LYJZM,
           TO_CHAR(SUM(JZLL), '99999999999.9') 井排液量,
           TO_CHAR(SUM(JZYL), '99999999999.9') 井排油量
      FROM YS_DHB12 T
     WHERE ZM = '利津联合站'
          /*
          AND ((RQ = TO_DATE('2012-09-17', 'yyyy-MM-dd') AND
              CJSJ IN
              ('10:00', '12:00', '14:00', '16:00', '18:00', '20:00', '22:00')) OR
              (RQ = TO_DATE('2012-09-18', 'yyyy-MM-dd') AND
              CJSJ IN ('0:00', '2:00', '4:00', '6:00', '8:00')))
          */
       
       --下面这个条件就是 一个月的数据 只取偶数小时的
       AND RQ BETWEEN TO_DATE('2012-08-31 10:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
           TO_DATE('2012-10-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS')
       AND MOD(TO_NUMBER(TO_CHAR(RQ, 'HH24')), 2) = 0   AND (LYJZM = '注采站' OR EXISTS (SELECT 1
                                       FROM YS_DHA14
                                      WHERE ZM = T.LYJZM
                                        AND ZB = '11'))
     GROUP BY TO_CHAR(RQ + 14 / 24, 'YYYY-MM-DD'), LYJZM;
      

  6.   

    在你的启发之下,我做出来了:
    select
     to_char(trunc(to_date(to_char(rq,'yyyy-MM-dd') ||' ' || cjsj,'yyyy-MM-dd HH24:MI')+14/24,'dd'),'yyyy-MM-dd') 日期
     ,lyjzm,TO_CHAR(sum(jzll),'99999999999.9') 井排液量,TO_CHAR(sum(jzyl),'99999999999.9') 井排油量
      from ys_dhb12 t where zm='滨五站'
         
    and 
    to_date(to_char(RQ,'yyyy-mm-dd')||' '||cjsj,'yyyy-mm-dd hh24:mi')>= TO_DATE('2012-08-31 10:00', 'YYYY-MM-DD HH24:MI') AND to_date(to_char(RQ,'yyyy-mm-dd')||' '||cjsj,'yyyy-mm-dd hh24:mi')<=
           TO_DATE('2012-10-01 08:00', 'YYYY-MM-DD HH24:MI') 
     and (lyjzm='注采站' or exists(select 1 from YS_DHA14 where zm=t.lyjzm and zb='11')) group by lyjzm
     
     ,trunc(to_date(to_char(rq,'yyyy-MM-dd') ||' ' || cjsj,'yyyy-MM-dd HH24:MI')+14/24,'dd')
     
      order by trunc(to_date(to_char(rq,'yyyy-MM-dd') ||' ' || cjsj,'yyyy-MM-dd HH24:MI')+14/24,'dd') desc不过我还有一个问题,这是另一个SQL语句:
    select
     to_char(trunc(to_date(to_char(rq,'yyyy-MM-dd') ||' ' || cjsj,'yyyy-MM-dd HH24:MI')+14/24,'dd'),'yyyy-MM-dd') 日期
     ,TO_CHAR(sum(jzll),'99999999999.9') 站处理液量,TO_CHAR(sum(jzyl),'99999999999.9') 站处理油量  from ys_dhb12 t where zm='滨五站'
         
    and 
    to_date(to_char(RQ,'yyyy-mm-dd')||' '||cjsj,'yyyy-mm-dd hh24:mi')>= TO_DATE('2012-08-31 10:00', 'YYYY-MM-DD HH24:MI') AND to_date(to_char(RQ,'yyyy-mm-dd')||' '||cjsj,'yyyy-mm-dd hh24:mi')<=
           TO_DATE('2012-10-01 08:00', 'YYYY-MM-DD HH24:MI') 
     and 
     
     SFJCLLC='1'
     
      group by  trunc(to_date(to_char(rq,'yyyy-MM-dd') ||' ' || cjsj,'yyyy-MM-dd HH24:MI')+14/24,'dd')
     
      order by trunc(to_date(to_char(rq,'yyyy-MM-dd') ||' ' || cjsj,'yyyy-MM-dd HH24:MI')+14/24,'dd') desc我想把它们合并到一起显示,就是排列在一行,怎么能实现啊?
      

  7.   

    SELECT TO_CHAR(TRUNC(TO_DATE(TO_CHAR(RQ, 'yyyy-MM-dd') || ' ' || CJSJ,
                                 'yyyy-MM-dd HH24:MI') + 14 / 24,
                         'dd'),
                   'yyyy-MM-dd') 日期,
           LYJZM,
           TO_CHAR(SUM(JZLL), '99999999999.9') 井排液量,
           TO_CHAR(SUM(JZYL), '99999999999.9') 井排油量,
           TO_CHAR(SUM(SUM(JZLL))
                   OVER(PARTITION BY
                        TO_CHAR(TRUNC(TO_DATE(TO_CHAR(RQ, 'yyyy-MM-dd') || ' ' || CJSJ,
                                              'yyyy-MM-dd HH24:MI') + 14 / 24,
                                      'dd'),
                                'yyyy-MM-dd')),
                   '99999999999.9') 站处理液量,
           TO_CHAR(SUM(SUM(JZYL))
                   OVER(PARTITION BY
                        TO_CHAR(TRUNC(TO_DATE(TO_CHAR(RQ, 'yyyy-MM-dd') || ' ' || CJSJ,
                                              'yyyy-MM-dd HH24:MI') + 14 / 24,
                                      'dd'),
                                'yyyy-MM-dd')),
                   '99999999999.9') 站处理油量
      FROM YS_DHB12 T
     WHERE ZM = '滨五站'
       AND TO_DATE(TO_CHAR(RQ, 'yyyy-mm-dd') || ' ' || CJSJ,
                   'yyyy-mm-dd hh24:mi') >=
           TO_DATE('2012-08-31 10:00', 'YYYY-MM-DD HH24:MI')
       AND TO_DATE(TO_CHAR(RQ, 'yyyy-mm-dd') || ' ' || CJSJ,
                   'yyyy-mm-dd hh24:mi') <=
           TO_DATE('2012-10-01 08:00', 'YYYY-MM-DD HH24:MI')
          
       AND (LYJZM = '注采站' OR EXISTS (SELECT 1
                                       FROM YS_DHA14
                                      WHERE ZM = T.LYJZM
                                        AND ZB = '11'))
     GROUP BY LYJZM,
              TRUNC(TO_DATE(TO_CHAR(RQ, 'yyyy-MM-dd') || ' ' || CJSJ,
                            'yyyy-MM-dd HH24:MI') + 14 / 24,
                    'dd')
     ORDER BY TRUNC(TO_DATE(TO_CHAR(RQ, 'yyyy-MM-dd') || ' ' || CJSJ,
                            'yyyy-MM-dd HH24:MI') + 14 / 24,
                    'dd') DESC
      

  8.   


    --我的颜色
    SELECT TO_CHAR(TRUNC(TO_DATE(TO_CHAR(RQ, 'yyyy-MM-dd') || ' ' || CJSJ,
                                 'yyyy-MM-dd HH24:MI') + 14 / 24,
                         'dd'),
                   'yyyy-MM-dd') 日期,
           LYJZM,
           TO_CHAR(SUM(JZLL), '99999999999.9') 井排液量,
           TO_CHAR(SUM(JZYL), '99999999999.9') 井排油量,
           TO_CHAR(SUM(SUM(JZLL))
                   OVER(PARTITION BY
                        TO_CHAR(TRUNC(TO_DATE(TO_CHAR(RQ, 'yyyy-MM-dd') || ' ' || CJSJ,
                                              'yyyy-MM-dd HH24:MI') + 14 / 24,
                                      'dd'),
                                'yyyy-MM-dd')),
                   '99999999999.9') 站处理液量,
           TO_CHAR(SUM(SUM(JZYL))
                   OVER(PARTITION BY
                        TO_CHAR(TRUNC(TO_DATE(TO_CHAR(RQ, 'yyyy-MM-dd') || ' ' || CJSJ,
                                              'yyyy-MM-dd HH24:MI') + 14 / 24,
                                      'dd'),
                                'yyyy-MM-dd')),
                   '99999999999.9') 站处理油量
      FROM YS_DHB12 T
     WHERE ZM = '滨五站'
       AND TO_DATE(TO_CHAR(RQ, 'yyyy-mm-dd') || ' ' || CJSJ,
                   'yyyy-mm-dd hh24:mi') >=
           TO_DATE('2012-08-31 10:00', 'YYYY-MM-DD HH24:MI')
       AND TO_DATE(TO_CHAR(RQ, 'yyyy-mm-dd') || ' ' || CJSJ,
                   'yyyy-mm-dd hh24:mi') <=
           TO_DATE('2012-10-01 08:00', 'YYYY-MM-DD HH24:MI')
          
       AND (LYJZM = '注采站' OR EXISTS (SELECT 1
                                       FROM YS_DHA14
                                      WHERE ZM = T.LYJZM
                                        AND ZB = '11'))
     GROUP BY LYJZM,
              TRUNC(TO_DATE(TO_CHAR(RQ, 'yyyy-MM-dd') || ' ' || CJSJ,
                            'yyyy-MM-dd HH24:MI') + 14 / 24,
                    'dd')
     ORDER BY TRUNC(TO_DATE(TO_CHAR(RQ, 'yyyy-MM-dd') || ' ' || CJSJ,
                            'yyyy-MM-dd HH24:MI') + 14 / 24,
                    'dd') DESC
      

  9.   

     站处理液量,站处理油量 不对,SFJCLLC='1' 这个条件没有用上啊
      

  10.   

    我擦。。 没注意你的where条件有区别,有区别的where条件得到的数据的统计口径就不一样,合并到一起有神马意义呢? 当然硬要合并 也行,但是没设呢意义。最简单的方法就是把第一个sql查询的结果插入临时表,然后按照相同的时间,把第二个sql的结果更新进去,然后直接查询临时表记录。不然因为你where条件的不同处理起来很麻烦,where条件相同用我写的sql就ok了。
      

  11.   


    谢谢啊,我用下面这个语句实现了,我就是为了把一个单位每天的各项统计数据在一行里显示:select * --日期,井排液量,井排油量,站处理油量 from
    (select
     to_char(trunc(to_date(to_char(rq,'yyyy-MM-dd') ||' ' || cjsj,'yyyy-MM-dd HH24:MI')+14/24,'dd'),'yyyy-MM-dd') 日期
     ,TO_CHAR(sum(jzll),'99999999999.9') 井排液量,TO_CHAR(sum(jzyl),'99999999999.9') 井排油量
      from ys_dhb12 t where zm='滨五站'
         
    and 
    to_date(to_char(RQ,'yyyy-mm-dd')||' '||cjsj,'yyyy-mm-dd hh24:mi')>= TO_DATE('2012-08-31 10:00', 'YYYY-MM-DD HH24:MI') AND to_date(to_char(RQ,'yyyy-mm-dd')||' '||cjsj,'yyyy-mm-dd hh24:mi')<=
           TO_DATE('2012-10-01 08:00', 'YYYY-MM-DD HH24:MI') 
     and (lyjzm='注采站' or exists(select 1 from YS_DHA14 where zm=t.lyjzm and zb='11'))
     
      group by 
     
     trunc(to_date(to_char(rq,'yyyy-MM-dd') ||' ' || cjsj,'yyyy-MM-dd HH24:MI')+14/24,'dd')
     
      order by trunc(to_date(to_char(rq,'yyyy-MM-dd') ||' ' || cjsj,'yyyy-MM-dd HH24:MI')+14/24,'dd') desc
      )
       a left join 
       
      (
      select
     to_char(trunc(to_date(to_char(rq,'yyyy-MM-dd') ||' ' || cjsj,'yyyy-MM-dd HH24:MI')+14/24,'dd'),'yyyy-MM-dd') 日期
     ,TO_CHAR(sum(jzyl),'99999999999.9') 站处理油量  from ys_dhb12 t where zm='滨五站'
         
    and 
    to_date(to_char(RQ,'yyyy-mm-dd')||' '||cjsj,'yyyy-mm-dd hh24:mi')>= TO_DATE('2012-08-31 10:00', 'YYYY-MM-DD HH24:MI') AND to_date(to_char(RQ,'yyyy-mm-dd')||' '||cjsj,'yyyy-mm-dd hh24:mi')<=
           TO_DATE('2012-10-01 08:00', 'YYYY-MM-DD HH24:MI') 
     and 
     
     SFJCLLC='1'
     
      group by  trunc(to_date(to_char(rq,'yyyy-MM-dd') ||' ' || cjsj,'yyyy-MM-dd HH24:MI')+14/24,'dd')
     
      order by trunc(to_date(to_char(rq,'yyyy-MM-dd') ||' ' || cjsj,'yyyy-MM-dd HH24:MI')+14/24,'dd') desc
      )
     b
     on a.日期=b.日期
    但是,第一句用*可以执行,用具体的字段名,如“日期,井排液量,井排油量,站处理油量”就报错,改成英文的也不行,不知是什么原因?
      

  12.   

    因为你有两个名字叫 【日期】 的字段,报错肯定是报 ora-00918, 意思就是列名有重复的。
    解决方法:把这俩【日期】改成不一样的名字。
      

  13.   


    --还有一种解决方法,把表别名加上去
    select a.日期,a.井排液量,a.井排油量,b.站处理油量