读书人

根据进货表、出货表生成出货明细的有关

发布时间: 2012-02-01 16:58:19 作者: rapoo

根据进货表、出货表生成出货明细的问题,拆分出货数从进货表取得单价!(含表结构)
进货表
进货编号 品名 数量 单价
1 aa 2 500
2 aa 3 500
3 aa 4 510
4 aa 1 510
5 aa 2 530

出货表
出货编号 品名 数量
1 aa 1
2 aa 2
3 aa 4
4 aa 4

结果表
编号 品名 数量 单价
1 aa 1 500
2 aa 2 500
3 aa 2 500
4 aa 2 510
5 aa 3 510
6 aa 1 530

create table #进货表(编号 int,品名 varchar(10),数量 int,单价 int)
insert #进货表 values(1, 'aa ' , 2 ,500 )
insert #进货表 values(2, 'aa ' , 3 ,500 )
insert #进货表 values(3, 'aa ' , 4 ,510 )


insert #进货表 values(4, 'aa ' , 1 ,510 )
insert #进货表 values(5, 'aa ' , 2 ,530 )


create table #出货表(编号 int,品名 varchar(10),数量 int)
insert #出货表 values(1, 'aa ' , 1)
insert #出货表 values(2, 'aa ' , 2)
insert #出货表 values(3, 'aa ' , 4)
insert #出货表 values(4, 'aa ' , 4)

说明:根据进货表和出货表生成结果表,价格有变化时需把出货表中数据进行拆分,体现不同单价。
例如出货编号为3的记录,出货为4个,因为前面已出货3个,单价为500的货物还剩2个,所以要把这笔记录拆分成两条记录用于体现价格的变化。2个价格500,2个价格510,若没有出货时涉及几次进货,每次进货都是同样的价格的话,不需要拆分,出几个就记几个


[解决办法]
好像是这样:
create table #进货表(编号 int,品名 varchar(10),数量 int,单价 int)
insert #进货表 values(1, 'aa ' , 2 ,500 )
insert #进货表 values(2, 'aa ' , 3 ,500 )
insert #进货表 values(3, 'aa ' , 4 ,510 )
insert #进货表 values(4, 'aa ' , 1 ,510 )
insert #进货表 values(5, 'aa ' , 2 ,530 )


create table #出货表(编号 int,品名 varchar(10),数量 int)
insert #出货表 values(1, 'aa ' , 1)
insert #出货表 values(2, 'aa ' , 2)
insert #出货表 values(3, 'aa ' , 4)
insert #出货表 values(4, 'aa ' , 4)
go

select tb.编号,
tb.品名,
[数量]=sum(case when tb.出货sum <ta.进货sum then tb.出货sum else ta.进货sum end
-
case when tb.出货sum-tb.数量 <ta.进货sum-ta.数量 then ta.进货sum-ta.数量 else tb.出货sum-tb.数量
end),
ta.单价
from
(select *,进货sum=(select sum(数量) from #进货表 where 品名=a.品名 and 编号!> a.编号)
from #进货表 a
)ta
join
(select *,出货sum=(select sum(数量) from #出货表 where 品名=b.品名 and 编号!> b.编号)
from #出货表 b ) tb
on ta.品名=tb.品名 and
tb.出货sum-tb.数量 <ta.进货sum and ta.进货sum-ta.数量 <tb.出货sum
group by ta.单价,tb.品名,tb.编号

go

编号 品名 数量 单价
----------- ---------- ----------- -----------
1 aa 1 500
2 aa 2 500
3 aa 2 500
3 aa 2 510
4 aa 3 510
4 aa 1 530

(所影响的行数为 6 行)

读书人网 >SQL Server

热点推荐