首先感谢昨天你帮忙的解答!这里还要再询问个问题,希望你指点下。
--仓库流水表
create table ruku(
      
 rid          varchar2(20) not null,   //流水单号
 hetongdanhao varchar2(20) ,           //合同单号
 tzid         varchar2(20) ,           //通知单号
 wid          varchar2(20) ,           //物品编号
 cangkuid     number(10) ,             //仓库编号
 shuliang     number(10),              //流水数量
 shijian      varchar2(30) ,           //流水时间
 leixing      number(8)                //流水类型  (入库1、出库2、期初3))--要求通过 cangkuid 、wid 、得到当年的每个月的 期初值、入库数、出库数、库存数。select 
   时间,
  (库存+出库-入库) 期初,
   入库,
   出库,
   库存
from(
      select   
         时间,
         sum(入库-出库)over(order by 时间)库存,
         入库,
         出库
from ( 
       select 
         substr(shijian,0,7)as 时间,
         sum( case when leixing=1 then rkshuliang else 0 end) as 入库,
         sum( case when leixing=2 then rkshuliang else 0 end) as 出库  
       from ruku
       group by substr(shijian,0,7)
      )a
     )
----
--报表是固定的 1-12 月份,中间如果有没有空出的月份,也要在表中显示为值为0.
--我效果实现是在前台利用月份直接匹配一次,如果没有匹配到的,就赋值为0.
--但是我自己反思,这个处理在后台也应该能做。可是我自己没有想出如何在这条查询语句的基础上直接处理。
--所以想请问下这个处理能直接在这条查询语句的基础上做处理嘛?希望指点下,学习!

解决方案 »

  1.   

    使用
    with t (select rownum from dual connect by rownum<=12)
    跟你的结果来个左关联.
      

  2.   

    类似这样
    WITH t AS (SELECT add_months(trunc(SYSDATE,'yyyy'),ROWNUM-1) stat_date FROM dual CONNECT BY ROWNUM<12),
         t1 AS(你的统计语句)
    SELECT t.stat_date,nvl(入库,0)........ FROM t,t1 WHERE to_char(t.stat_date,'yyyymm')=to_char(t1.时间,'yyyymm')(+);
      

  3.   

    ....看了你之前的帖子,没必要用add_months了,直接用rownum就可以跟你的时间关联了.
      

  4.   


    能说下 这里 用add_months 和直接用rownuw的区别嘛?
      

  5.   

    select 
       时间,
      (库存+出库-入库) 期初,
       入库,
       出库,
       库存
    from(
          select   
             b.ym 时间,
             sum(nvl(a.入库,0)-nvl(a.出库,0))over(order by b.ym)库存,
             nvl(a.入库,0)入库,
             nvl(a.出库,0)出库
    from ( 
           select 
             substr(shijian,0,7)as 时间,
             sum( case when leixing=1 then rkshuliang else 0 end) as 入库,
             sum( case when leixing=2 then rkshuliang else 0 end) as 出库  
           from ruku
           WHERE shijian BETWEEN '2009' AND '2010'
           group by substr(shijian,0,7)
          )a,
          (SELECT '2009'||'-'||TO_number(ROWNUM,'fm00') ym FROM all_objects WHERE ROWNUM<=12) b
      WHERE a.时间(+)=b.ym
         )
      

  6.   

    非常感谢 wildwave 的解答!!! 
    原来如此就解决了(SELECT '2009'||'-'||TO_number(ROWNUM,'fm00') ym FROM all_objects WHERE ROWNUM<=12) b
      WHERE a.时间(+)=b.ym