2011-8-27   生产发货  单号 F01B01    200个
B02    200个2011-8-28   生产发货   单号F02B01   100个  
B02   100个  2011-8-29   生产退货  单号 FB01B01   -50个  
B02   -50个 2011-8-30   生产收货  S01A01   200个
通过SQL代码得到结果:
单据日期    单据号         物料编码 期初 本期入  本期出   结存数量
2011-8-27   生产发货F01     B01      0     200     0        200
2011-8-28   生产发货F02     B01      200   100     0        300
2011-8-29   生产退货FB01    B01      300   -50     0        250
2011-8-30   生产收货S01     B01      250     0    200        50
2011-8-27   生产发货F01     B02      0     200     0        200
2011-8-28   生产发货F02     B02      200   100     0        300
2011-8-29   生产退货FB01    B02      300   -50     0        250
2011-8-30   生产收货S01     B02      250     0    200        50说明:结存数量为动态结存,下一行的期初等于上一行的结存数量。即上一行的结存+本行的本期入-本行的本期出=本行结存数量。哪位大侠帮忙看看这个代码应该怎么写呀?

解决方案 »

  1.   

    2011-8-27 生产发货 单号 F01B01 200个
    B02 200个2011-8-28 生产发货 单号F02B01 100个  
    B02 100个  2011-8-29 生产退货 单号 FB01B01 -50个  
    B02 -50个 2011-8-30 生产收货 S01A01 200个这些是表数据还是?
      

  2.   

    你先参考这个,晚上有时间再帮你写.一个累计或先进先出的例
    http://topic.csdn.net/u/20110916/15/c4e19235-97a9-43d0-bc40-af2fc2d879ef.html?73503表信息:
    TB1(总表)--表名
    物料号 库存数 仓库号 --列名
    A1 100 001 --列值
    A2 300 001 --列值TB2(入库明细表)--表名
    入库单号 行号 物料号 入库数 --列名
    B001 01 A1 30 --列值
    B002 01 A1 50   
    B003 02 A2 70   
    ...需求:
    逐行查询入库明细表,对入库数进行累加,当累加数大于或者等于库存数时停止。并把查询的明细列出来。create table TB1(物料号 varchar(10),库存数 int,仓库号 varchar(10))
    insert into tb1 values('A1' ,100 ,'001')
    insert into tb1 values('A2' ,300 ,'001')create table TB2(入库单号 varchar(10),行号 varchar(10),物料号 varchar(10), 入库数 int)
    insert into tb2 values('B001', '01', 'A1', 30)
    insert into tb2 values('B002', '01', 'A1', 50)
    insert into tb2 values('B003', '01', 'A1', 30)
    insert into tb2 values('B004', '01', 'A1', 40)
    insert into tb2 values('B005', '02', 'A2', 70)goselect m.*,
           累计数 = (case when (select sum(入库数) from tb2 where 物料号 = m.物料号 and 入库单号 <= m.入库单号) <= n.库存数 then (select sum(入库数) from tb2 where 物料号 = m.物料号 and 入库单号 <= m.入库单号) 
                          when (select sum(入库数) from tb2 where 物料号 = m.物料号 and 入库单号 <= m.入库单号) > n.库存数 + m.入库数 then 0
                          else n.库存数 end)
    from tb2 m , tb1 n
    where m.物料号 = n.物料号drop table tb1 , tb2  /*
    入库单号       行号         物料号        入库数         累计数         
    ---------- ---------- ---------- ----------- ----------- 
    B001       01         A1         30          30
    B002       01         A1         50          80
    B003       01         A1         30          100
    B004       01         A1         40          0
    B005       02         A2         70          70(所影响的行数为 5 行)
    */
      

  3.   

    --看不懂你数据间的关系,暂且如此,自己更改.
    create table tb(单据日期 datetime,类型 varchar(10),单号 varchar(10),物料编码 varchar(10),数量 int)
    insert into tb values('2011-8-27', '生产发货','F01'  ,'B01', 200)
    insert into tb values('2011-8-27', '生产发货','F01'  ,'B02', 200)
    insert into tb values('2011-8-28', '生产发货','F02'  ,'B01', 100)   
    insert into tb values('2011-8-28', '生产发货','F02'  ,'B02', 100)   
    insert into tb values('2011-8-29', '生产退货','FB01' ,'B01', -50)   
    insert into tb values('2011-8-29', '生产退货','FB01' ,'B02', -50)  
    insert into tb values('2011-8-30', '生产收货','S01'  ,'A02', 200)
    goselect m.* , 
           期初 = isnull((select sum(数量) from tb where 单据日期 < m.单据日期 and 物料编码 = m.物料编码),0),
           本期入 = 数量,
           本期出 = (case when 类型 = '生产发货' then 数量 else 0 end),
           结存数量 = isnull((select sum(数量) from tb where 单据日期 < m.单据日期 and 物料编码 = m.物料编码),0) + 数量
    from tb m order by m.物料编码 , m.单据日期drop table tb/*
    单据日期                                                   类型         单号         物料编码       数量          期初          本期入         本期出         结存数量        
    ------------------------------------------------------ ---------- ---------- ---------- ----------- ----------- ----------- ----------- ----------- 
    2011-08-30 00:00:00.000                                生产收货       S01        A02        200         0           200         0           200
    2011-08-27 00:00:00.000                                生产发货       F01        B01        200         0           200         200         200
    2011-08-28 00:00:00.000                                生产发货       F02        B01        100         200         100         100         300
    2011-08-29 00:00:00.000                                生产退货       FB01       B01        -50         300         -50         0           250
    2011-08-27 00:00:00.000                                生产发货       F01        B02        200         0           200         200         200
    2011-08-28 00:00:00.000                                生产发货       F02        B02        100         200         100         100         300
    2011-08-29 00:00:00.000                                生产退货       FB01       B02        -50         300         -50         0           250(所影响的行数为 7 行)
    */--和你一个几乎一模一样的帖,自己也可以参考一下:
    一个入库出库结存的示例
    http://topic.csdn.net/u/20110910/00/83791d97-73fc-434e-9571-e7e4db7dd138.html?53577tableA:
      DATE \ CODE \ ADD \ ITEM \ TYPE \ QTY
    2011-1-1 A 仓库1 项目1 期初 10
    2011-1-1 B 仓库1 项目1 期初 10
    2011-1-1 A 仓库1 项目2 期初 20
    2011-1-3 A 仓库2 项目1 采购 15
    2011-1-3 A 仓库1 项目1 领用 5
    2011-1-1 B 仓库1 项目1 领用 1
    2011-1-8 A 仓库2 项目1 领用 3结果是下面这样的,上面的没有对应好,每列都需要算结存的。
    分别按照项目号和材料进行统计台账结果
    可以按照DATE,CODE,ITEM进行排序
    台账结果(直接查询或者根据ITEM查询)
      DATE \ CODE \ ADD \ ITEM \ TYPE \期初 \ 入库 \ 出库 \结存
    2011-1-1 A 仓库1 项目1 期初 ---------10 ---------------10
    2011-1-3 A 仓库2 项目1 采购 ----------------15-------- 25
    2011-1-3 A 仓库1 项目1 领用 ----------------------5--- 20
    2011-1-8 A 仓库2 项目1 领用 ----------------------3 ---172011-1-1 B 仓库1 项目1 期初 ---------10--------------- 10
    2011-1-1 B 仓库1 项目1 领用 ----------------------1---- 92011-1-1 A 仓库1 项目2 期初 ---------20 ---------------20
    ...请指导,多谢!create table tb(id int identity, DATE datetime, CODE varchar(10), [ADD] varchar(10), ITEM varchar(10), TYPE varchar(10), QTY int)
    insert into tb(DATE,CODE,[ADD],ITEM,TYPE,QTY) values('2011-1-1', 'A', '仓库1', '项目1', '期初', 10)
    insert into tb(DATE,CODE,[ADD],ITEM,TYPE,QTY) values('2011-1-1', 'B', '仓库1', '项目1', '期初', 10)
    insert into tb(DATE,CODE,[ADD],ITEM,TYPE,QTY) values('2011-1-1', 'A', '仓库1', '项目2', '期初', 20)
    insert into tb(DATE,CODE,[ADD],ITEM,TYPE,QTY) values('2011-1-3', 'A', '仓库2', '项目1', '采购', 15)
    insert into tb(DATE,CODE,[ADD],ITEM,TYPE,QTY) values('2011-1-3', 'A', '仓库1', '项目1', '领用', 5)
    insert into tb(DATE,CODE,[ADD],ITEM,TYPE,QTY) values('2011-1-1', 'B', '仓库1', '项目1', '领用', 1)
    insert into tb(DATE,CODE,[ADD],ITEM,TYPE,QTY) values('2011-1-8', 'A', '仓库2', '项目1', '领用', 3)
    goselect t1.DATE,t1.CODE,t1.[ADD],t1.ITEM,t1.TYPE,t2.期初,t2.入库,t2.出库,t1.结存 from
    (
    select m.id,m.DATE,m.CODE,m.[ADD],m.ITEM,m.TYPE,
    m.qty 期初,结存 = (select sum(newqty) from 
    (
      select * , newqty = (case when type = '期初' or type = '采购' then QTY when type = '领用' then -qty end) from tb
    ) n where m.item = n.item and m.code = n.code and m.id >= n.id)
    from
    (
      select * , newqty = (case when type = '期初' or type = '采购' then QTY when type = '领用' then -qty end) from tb
    ) m
    ) t1,
    (
    select id , 
           max(case when TYPE = '期初' then qty else 0 end) 期初,
           max(case when TYPE = '采购' then qty else 0 end) 入库,
           max(case when TYPE = '领用' then qty else 0 end) 出库
    from tb
    group by id
    ) t2
    where t1.id = t2.id
    order by t1.item,t1.code,case when TYPE ='期初' then 1 else 2 end
    drop table tb/*
    DATE                                                   CODE       ADD        ITEM       TYPE       期初          入库          出库          结存          
    ------------------------------------------------------ ---------- ---------- ---------- ---------- ----------- ----------- ----------- ----------- 
    2011-01-01 00:00:00.000                                A          仓库1        项目1        期初         10          0           0           10
    2011-01-03 00:00:00.000                                A          仓库2        项目1        采购         0           15          0           25
    2011-01-03 00:00:00.000                                A          仓库1        项目1        领用         0           0           5           20
    2011-01-08 00:00:00.000                                A          仓库2        项目1        领用         0           0           3           17
    2011-01-01 00:00:00.000                                B          仓库1        项目1        期初         10          0           0           10
    2011-01-01 00:00:00.000                                B          仓库1        项目1        领用         0           0           1           9
    2011-01-01 00:00:00.000                                A          仓库1        项目2        期初         20          0           0           20(所影响的行数为 7 行)
    */