--仓库流水表
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 、得到当年的每个月的 期初值、入库数、出库数、库存数。--期初值 == 1月的期初等于上1年的库存,(也可以直接初始为0)。
--库存数 ==  当月期初值 + 当月入库总数 - 当月出库总数 。--查询sql:select  
         时间,
         sum(入库) 入库, sum(出库) 出库,
         (sum(入库)-sum(出库))as 库存from (   select  substr(shijian,0,7)as 时间,
       ( case when leixing=1  then rkshuliang else 0 end) as 入库,
       ( case when leixing=2 then rkshuliang  else 0 end) as 出库 
 
 from ruku
     )agroup by 时间
--我不知道这里期初要怎么表现出来,求大侠帮帮忙!!!-- 展现效果如下  月份    期初   入库   出库   库存
   1       0      300    100    200
   2       200    400    300    300 
   3       300    300    400    200

解决方案 »

  1.   

    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)
      

  2.   

    --库存数 ==  当月期初值 + 当月入库总数 - 当月出库总数 。select 时间,入库,出库,sum(入库-出库) over(order by 时间)+入库-出库 as 期初from
    (select  
             时间,
             sum(入库) 入库, sum(出库) 出库,
            from (   select  substr(shijian,0,7)as 时间,
           ( case when leixing=1  then rkshuliang else 0 end) as 入库,
           ( case when leixing=2 then rkshuliang  else 0 end) as 出库 
     
     from ruku
         )a
    group by 时间)
      

  3.   


    --多了个逗号,楼主说下测试结果
    select 时间,入库,出库,sum(入库-出库) over(order by 时间)+入库-出库 as 期初from
    (select  
             时间,
             sum(入库) 入库, sum(出库) 出库
            from (   select  substr(shijian,0,7)as 时间,
           ( case when leixing=1  then rkshuliang else 0 end) as 入库,
           ( case when leixing=2 then rkshuliang  else 0 end) as 出库 
     
     from ruku
         )a
    group by 时间)
      

  4.   


    --多了个逗号,楼主说下测试结果
    select 时间,入库,出库,sum(入库-出库) over(order by 时间)+入库-出库 as 期初from
    (select  
             时间,
             sum(入库) 入库, sum(出库) 出库
            from (   select  substr(shijian,0,7)as 时间,
           ( case when leixing=1  then rkshuliang else 0 end) as 入库,
           ( case when leixing=2 then rkshuliang  else 0 end) as 出库 
     
     from ruku
         )a
    group by 时间)
    白天在做事,没注意看回复。
    刚刚做了测试,好像有问题。
    期初的结果不对,
    我数据库里面  1月的 总入库数 =  600; 总出库数 = 100; 这里我1月的期初是做0来处理的,按道理得到的库存应该是 500. 但是得到的期初是1000, 2月  总入库为 = 100 , 总出库 = 100,期初显示的是 500.测试结果不对。 
    另外我在期初的里面少写了一个条件, 1月期初等于去年结余,而后面月份的期初 都等于上个月的库存。
      

  5.   

    前面没看清楚..
    按年来分的话sum()over()后面加个partition by 参数即可
    1月期初用case +lag()over()
    具体就不写了,实在不知道截取前7位是怎么表示年月的