根据进货表、出货表生成出货明细的问题,拆分出货数从进货表取得单价!(含表结构)

yunnan201 2007-07-21 01:21:32
进货表
进货编号 品名 数量 单价
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,若没有出货时涉及几次进货,每次进货都是同样的价格的话,不需要拆分,出几个就记几个
...全文
2226 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunnan201 2007-07-23
  • 打赏
  • 举报
回复
我先测试一下是不是适应多种情况。
yunnan201 2007-07-23
  • 打赏
  • 举报
回复
我先看看。多谢了,随后给你分
yunnan201 2007-07-23
  • 打赏
  • 举报
回复
老大,再问一下,如果之前已经这样算过一次成本了,用这个公式不是每次还得从第一条记录开始计算么??还是说要把之后的进货和出货提取出来,再用公式计算剩下部分??
中国风 2007-07-22
  • 打赏
  • 举报
回复
楼主是用先进先出的计算成本,上面的语句是通用的
中国风 2007-07-22
  • 打赏
  • 举报
回复
用上面的语句就行了。

create table #进货表(编号 int,品名 varchar(10),数量 int,单价 int)
insert #进货表 select 1, 'aa', 2, 500
union all select 2, 'aa', 3, 500
union all select 3, 'aa', 4, 500
union all select 4, 'aa', 1, 510
union all select 5, 'aa', 2, 510
union all select 6, 'aa', 8, 510
union all select 7, 'aa', 3, 510


create table #出货表(编号 int,品名 varchar(10),数量 int)
insert #出货表 select 1, 'aa', 7
union all select 2, 'aa', 8
union all select 3, 'aa', 2
union all select 4, 'aa', 1
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 7 500
2 aa 2 500
2 aa 6 510
3 aa 2 510
4 aa 1 510

(所影响的行数为 5 行)

编号 显示 为自增用存储过程或程序/表自增都可以
yunnan201 2007-07-21
  • 打赏
  • 举报
回复
大哥辛苦下啦!帮个忙,有点麻烦的。我看了论坛里很多人问这样的问题的,就那我的贴当一次总结好了。我看过他们的答案,可是有和我的需求有些出入噢。又不会改,刚学SQL
yunnan201 2007-07-21
  • 打赏
  • 举报
回复
再来一组数据,重点是出货表第2条纪录,出货8个,怎么判断出单价500的出2个,510的出三个
并且把单价一起取出来;另外一个重点是在出货表第2条记录还没发生的时候我要提前判断出怎么拆分
这两种价格的出货。

例如:出货的时候我输入一个总的出货8,然后自动判断出库存里有500和510这两个价格的货物,
这样就先出先进货的500单价那个货物,出完了再出510单价的那种。总数一共8个,生成两条纪录 (结果表里的2,3条纪录)

进货表
进货编号 品名 数量 单价
1 aa 2 500
2 aa 3 500
3 aa 4 500
4 aa 1 510
5 aa 2 510
6 aa 8 510
7 aa 3 510

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


结果表
编号 品名 数量 单价
1 aa 7 500
2 aa 2 500
3 aa 6 510
4 aa 2 510
5 aa 1 510
中国风 2007-07-21
  • 打赏
  • 举报
回复
楼主根据自已效果加一下条件就行了。。
yunnan201 2007-07-21
  • 打赏
  • 举报
回复
就是说用一个存储过程来写,然后能满足各种有这样价格变化的情况。
不变化的时候也要能用
因为我的变化不是很频繁。但还是有变化的,主要是变化的时候我不好取那个价格啊
有两个价格库存的时候就不好取
中国风 2007-07-21
  • 打赏
  • 举报
回复
上次。。。解释为“上面语句”

哈哈~~
中国风 2007-07-21
  • 打赏
  • 举报
回复
上次也就是按先进先出计算成本。。。。。

计算库存可以用后进先出的方式。。。

通用点是指什么情况下?

yunnan201 2007-07-21
  • 打赏
  • 举报
回复
楼主能给我做得通用点吗??
就是说不发生价格变化的情况直接把出货数记到结果表,价格不调整,如果出货涉及到两个价格的就直接把出货数拆分,在结果表体现出单价的不同,这样便于计算出货成本。
最好有个存储过程就好了

谢谢你了啊“roy_88(中国风_燃烧你的激情!!!) ( ) 信誉:100 ”
我关注过你很多贴了 ,呵呵 第一次提问呢
中国风 2007-07-21
  • 打赏
  • 举报
回复
记录3\4为两个进货数量的都存在
中国风 2007-07-21
  • 打赏
  • 举报
回复
好像是这样:
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 行)

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧