-- 問題
庫存表A(現有庫存)
PARTNO PARTDESC VENDO GRADE SALESTYPE UNIT QTY
A001 N-07 L KG 800
B005 M01 O KG 500
.....
收貨記錄表B
PARTNO VENDNO SALESTYPE ACTQTY INDATE(收貨時間)
A001 N-07 L 250 5/01
A001 N-07 L 250 6/10
A001 N-07 O 300 6/15
A001 N-07 L 300 6/25
A001 N-07 L 300 7/02
A001 N-66 L 250 7/08
A001 M88 L 280 7/1
B005 M01 O 300 5/05
B005 M01 O 200 6/01
......
爲實現後進先出的目的,根據庫存量取出最近的收貨記錄
比如物料A001 N-07 L 庫存量是800,則取出最近>=800數量的收貨記錄
A001 N-07 L 300 7/02
A001 N-07 L 300 6/25
A001 N-07 L 250 6/10
300+300+250>=800
條件:1 B表的PARTNO VENDNO SALESTYPE 三個字段的值等於表A的
PARTNO PARTDESC VENDO GRADE SALESTYPE UNIT QTY 收貨記錄
A001 N-07 L KG 800 7/02 300 6/25 300 6/10 250
B005 M01 O KG 500 6/01 200 5/05 300
得到以上的結果就行,格式不限
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- 解答
drop table tba,tbb
create table tbA(partno varchar(10), PARTDESC varchar(10), VENDNO varchar(10), GRADE varchar(10), SALESTYPE varchar(10), UNIT varchar(10), QTY int)
create table tbB(PARTNO varchar(10), VENDNO varchar(10), SALESTYPE varchar(10), ACTQTY int, INDATE datetime)
insert into tbA select 'A001', '', 'N-07', '', 'L', 'KG', 800
insert into tbA select 'B005', '', 'M01', '', 'O', 'KG', 500
insert into tbB select 'A001', 'N-07', 'L', 250 , '2008-05-01'
insert into tbB select 'A001', 'N-07', 'L', 250 , '2008-06-10'
insert into tbB select 'A001', 'N-07', 'O', 300 , '2008-06-15'
insert into tbB select 'A001', 'N-07', 'L', 300 , '2008-06-25'
insert into tbB select 'A001', 'N-07', 'L', 300 , '2008-07-02'
insert into tbB select 'A001', 'N-66', 'L', 250 , '2008-07-08'
insert into tbB select 'A001', 'M88', 'L', 280 , '2008-07-01'
insert into tbB select 'B005', 'M01', 'O', 300 , '2008-05-05'
insert into tbB select 'B005', 'M01', 'O', 200 , '2008-06-01'
--drop function dbo.test
create
alter function dbo.test(@partno varchar(10), @vendno varchar(10), @SALESTYPE varchar(10), @actqty int)
returns @tbtest table(partno varchar(10), PARTDESC varchar(10), VENDO varchar(10), GRADE varchar(10), SALESTYPE varchar(10), UNIT varchar(10), QTY int,memo varchar(200))
as
begin
declare @s int,@ss varchar(100)
select @s = 0, @ss = '';
select
@ss = @ss + ' ' + case when @s < 800 then convert(varchar(10),indate,120) + ' ' + rtrim(actqty) else '' end,
@s = @s + case when @s < @actqty then actqty else 0 end
from tbB where partno = @partno and vendno = @vendno and SALESTYPE = @SALESTYPE order by indate desc
--select @s,@ss
insert into @tbtest
select *,@ss from tbA where partno = @partno and vendno = @vendno and SALESTYPE = @SALESTYPE
return
end
select b.* from tba a CROSS APPLY
dbo.test(a.partno, a.vendno, SALESTYPE, qty) b
--where a.partno = 'a001'