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说明:结存数量为动态结存,下一行的期初等于上一行的结存数量。即上一行的结存+本行的本期入-本行的本期出=本行结存数量。哪位大侠帮忙看看这个代码应该怎么写呀?
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说明:结存数量为动态结存,下一行的期初等于上一行的结存数量。即上一行的结存+本行的本期入-本行的本期出=本行结存数量。哪位大侠帮忙看看这个代码应该怎么写呀?
B02 200个2011-8-28 生产发货 单号F02B01 100个
B02 100个 2011-8-29 生产退货 单号 FB01B01 -50个
B02 -50个 2011-8-30 生产收货 S01A01 200个这些是表数据还是?
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 行)
*/
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 行)
*/