一张出入库表FStore 主要字段为
单据主键       单据编号     单据时间     单据类型   物品类型ID   物品数量
1             入库单001    2013-7-1       1         1001       20
2             入库单002    2013-7-2       1         1001       10
3             入库单003    2013-7-2       1         1002       50
4             出库单001    2013-7-10      2         1001       25
5             出库单002    2013-7-12      2         1002       30入库单类型为1 出库为2
-------------------我想按照先进先出的原则对入库单进行统计,如以下结果--------------------
 
 入库单号       入库时间   物品类型ID    入库数量    已出库数量            剩余数量
 入库单001     2013-7-1     1001         20          20                  0
 入库单002     2013-7-2     1001         10           5                  5
 入库单003     2013-7-10    1002         50          30                 20
-------------已单据时间做为查询条件,传如开始时间和结束时间2个参数写一个存储过程请问怎么写-----------

解决方案 »

  1.   


    if OBJECT_ID('tb') is not null
    drop table tb
    create table tb
    (
    单据主键 int,
    单据编号 varchar(50),
    单据时间 datetime,
    单据类型 int,
    物品类型ID int,
    物品数量 int
    )insert into tb 
    select 1,'001','2013-7-1',1,1001,20 union all
    select 1,'001','2013-7-1',1,1001,5 union all
    select 2,'002','2013-7-2',1,1001,10 union all
    select 3,'003','2013-7-2',1,1002,50 union all
    select 4,'001','2013-7-10',2,1001,15 union all
    select 5,'002','2013-7-12',2,1002,10
    gocreate proc proc_name
    @beginTime datetime='2013-7-1',
    @endTime datetime='2013-7-3'
    as
    begin ;with tab as(
    select 入库单号=单据编号,入库时间=单据时间,物品类型ID,入库数量=sum(物品数量),
    出库数量=isnull((select SUM(物品数量) from tb t2 where t2.单据编号=t1.单据编号 and t2.单据类型=2),0)
    from tb t1
    where 单据类型=1 and 单据时间 between @beginTime and @endTime group by 单据编号,单据时间,物品类型ID
    )
    select *,剩余数量=入库数量-出库数量 from tab

    end--exec proc_name @beginTime='2013-7-1',@endTime='2013-9-4'-----------------------------------------------------------------
    001 2013-07-01 00:00:00.000 1001 25 15 10
    002 2013-07-02 00:00:00.000 1001 10 10 0
    003 2013-07-02 00:00:00.000 1002 50 0 50
      

  2.   


    create table FStore
    (单据主键  int, 单据编号 varchar(16), 单据时间 date, 单据类型 int, 物品类型ID int, 物品数量 int)insert into FStore
     select 1, '入库单001', '2013-7-1', 1, 1001, 20 union all
     select 2, '入库单002', '2013-7-2', 1, 1001, 10 union all
     select 3, '入库单003', '2013-7-2', 1, 1002, 50 union all
     select 4, '出库单001', '2013-7-10', 2, 1001, 25 union all
     select 5, '出库单002', '2013-7-12', 2, 1002, 30
    with t as
    (select a.单据编号 '入库单号',
            a.单据时间 '入库时间',
            a.物品类型ID,
            a.物品数量 '入库数量',
            (select sum(b.物品数量)
             from FStore b 
             where b.单据类型=2 and b.物品类型ID=a.物品类型ID
             and b.单据时间>a.单据时间) 'x',
            (select sum(c.物品数量)
             from FStore c
             where c.单据类型=1 and c.物品类型ID=a.物品类型ID
             and c.单据时间<=a.单据时间) 'y'        
     from FStore a
     where a.单据类型=1
    )
    select 入库单号,入库时间,物品类型ID,入库数量,
           case when y<=x then 入库数量 else 入库数量-(y-x) end '已出库数量',
           入库数量-case when y<=x then 入库数量 else 入库数量-(y-x) end '剩余数量'
     from t/*
    入库单号             入库时间       物品类型ID      入库数量        已出库数量       剩余数量
    ---------------- ---------- ----------- ----------- ----------- -----------
    入库单001           2013-07-01 1001        20          20          0
    入库单002           2013-07-02 1001        10          5           5
    入库单003           2013-07-02 1002        50          30          20(3 row(s) affected)
    */
      

  3.   

    4楼的大大 你的sql是可以实现的,但是在10w条数据貌似查询太慢了.请问还能优化吗
      

  4.   

    4楼的大大 你的sql是可以实现的,但是在10w条数据貌似查询太慢了.请问还能优化吗
      

  5.   

    lujun198206:
    有没有当天入库数天出库的情况?
      

  6.   

    lujun198206:
    有没有当天入库当天出库的情况?
      

  7.   

    建个索引试试,  create index ix_FStore_ts on FStore(物品类型ID,单据时间,单据类型)