高分求助:一道适用又有挑战性的题目,帮忙研究下

antsing_2008 2008-08-31 12:00:42

--帮忙解决下,算出库存表里能组多少套(完整)A和B,
--注意不同仓库不能组在一套
--注意公用分件
--尽量不用游标,不用循环

create table #t1 --套件组合需求表
(
fpg varchar(10) null,--套件
fg varchar(10) null,--分件
fqty int null --需要的数量
)
create table #t2 --库存表
(
fstkcode varchar(10) null,--仓库
fg varchar(10) null,--分件
fqty int null --库存数
)

insert into #t1
select 'a','a1',1
union
select 'a','a2',2
union
select 'a','a3',3
union
select 'b','b1',2
union
select 'b','b2',1
union
select 'b','b3',1
--表示a由a1,a2,a3按1:2:3组成

insert into #t2
select 's1','a1',1
union
select 's1','a2',2
union
select 's1','a3',3
union
select 's2','b1',2
union
select 's2','b2',1
union
select 's2','b3',1
union
select 's2','a1',2

drop table #t1
drop table #t2
...全文
289 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwd252 2008-09-05
  • 打赏
  • 举报
回复
学习
Herb2 2008-09-05
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 antsing_2008 的回复:]
Herb2:对不起,你的答案是对的,只不过8000个字符不能存多少吧?
fcuandy:麻烦你解释得更清楚些,因为我周六要用,所以得快点结
[/Quote]
那你就用2005吧,采用varchar(max)
Herb2 2008-09-04
  • 打赏
  • 举报
回复
漏了 group by fpg,fstkode
Herb2 2008-09-04
  • 打赏
  • 举报
回复
create table #t1 --套件组合需求表
(
fpg varchar(10) null,--套件
fg varchar(10) null,--分件
fqty int null --需要的数量
)
create table #t2 --库存表
(
fstkcode varchar(10) null,--仓库
fg varchar(10) null,--分件
fqty int null --库存数
)
--------------------------------------------------------------------------------
你的问题要分两种情况,一种是能组多少组,也就是按照一定的方式进行组合就行了,这个比较好办。
还有一种是最大能组多少组,也就是需要组数最大,这个难办。
下面给个好办的,绝对不用循环,但要用动态语句:
--其实原理和循环一下,取出一个FPG,处理(算出组数,更新仓库表)完成了,取出下一个FPG。
--结果在#t3 表中
declare @sql varchar(8000)
create table #t3(fpg varchar(10),fstkcode varchar(10),zs int)
select @sql = isnull(@sql,'')+' insert #t3 select fpg,fstkode,min(b.fqty/a.fqty) from #t1 a,#t2 b
where a.fg = b.fg and a.fpg = '''+fpg+'''
delete #t3 where zs = 0
update a set fqty = a.fqty - b.fqty*c.zs from #t2 a,#t1 b,#t3 c
where a.fg = b.fg and b.fpg = c.fpg and a.fstkcode = c.fstkcode
and a.fpg = '''+fpg+''' '
from #t1 group by fpg order by fpg
exec(@sql)
select * from #t3

antsing_2008 2008-09-04
  • 打赏
  • 举报
回复
Herb2:对不起,你的答案是对的,只不过8000个字符不能存多少吧?
fcuandy:麻烦你解释得更清楚些,因为我周六要用,所以得快点结
antsing_2008 2008-09-04
  • 打赏
  • 举报
回复
本人比较笨,还是不太理解,学习
fcuandy 2008-09-04
  • 打赏
  • 举报
回复
如果是第二种情况,那么,我已经说过了,加个标识列,依具a,b哪个在前面出现,把id靠前的物品所占的数量扣除就行了。
写法已经在上面了, 我再没有别的补充了。
lussnailatnet 2008-09-04
  • 打赏
  • 举报
回复
Mark
antsing_2008 2008-09-04
  • 打赏
  • 举报
回复
fcuandy:你好,
如果考滤公用部分的占用的话,分两种情况:

1,公用部分的占用,如果不限制,即,谁都可以占用,即都有优先权,或者说共中任一个没有、优先权。
这种情况下, 选出的数据结果应该是好几组组合, 这种情况, 不用细想都知道不靠循环是完成不了的。

2,公用部分的占用,被靠前的物品占用,这种情况下,以上面数据为例,比如 a,b同用 a1时,当a1数量不足以供a,b同时使用时,a有优先权。
---------------------------
按照我目前的数据应该是第二种情况,谢谢再提供,测试数据中5楼提供的有公用分件在内
-------------------------------------------------------------------------

Herb2:你好,虽然你写的返回数据不对,但是你的思路受益
------------------------------------------------------------------------
一楼测试数据正确的返回值(0套不算)
a s1 1
b s2 1
5楼测试数据的返回值(0套不算)

a s1 1
-------------------------------
离散分不远了,漂亮的答案越来越近了,哈哈!
争取明天之前散分


fcuandy 2008-09-03
  • 打赏
  • 举报
回复
以上语句没有考滤公用部分的占 用。

如果考滤公用部分的占用的话,分两种情况:

1,公用部分的占用,如果不限制,即,谁都可以占用,即都有优先权,或者说共中任一个没有、优先权。
这种情况下, 选出的数据结果应该是好几组组合, 这种情况, 不用细想都知道不靠循环是完成不了的。

2,公用部分的占用,被靠前的物品占用,这种情况下,以上面数据为例,比如 a,b同用 a1时,当a1数量不足以供a,b同时使用时,a有优先权。
这种情况下,在我写的语句基础上使用标识列就可以解决。


具体的,楼主说明再说。
fcuandy 2008-09-03
  • 打赏
  • 举报
回复
暂时写到这,只是抛砖引玉。因为不知道,如果数据很充足的话,你具体需要什么样的结果。

有详细的数据的话,我会继续在这个思路上写下去。



create table #t1 --套件组合需求表 
(
fpg varchar(10) null,--套件
fg varchar(10) null,--分件
fqty int null --需要的数量
)
create table #t2 --库存表
(
fstkcode varchar(10) null,--仓库
fg varchar(10) null,--分件
fqty int null --库存数
)

insert into #t1
select 'a','a1',1
union
select 'a','a2',2
union
select 'a','a3',3
union
select 'b','b1',2
union
select 'b','b2',1
union
select 'b','b3',1
--表示a由a1,a2,a3按1:2:3组成

insert into #t2
select 's1','a1',1
union
select 's1','a2',2
union
select 's1','a3',3
union
select 's2','b1',2
union
select 's2','b2',1
union
select 's2','b3',1
union
select 's2','a1',2


--select * from #t1
--select * from #t2
--select distinct fpg,fstkcode from #t1 a
-- cross join #t2 b

select distinct a.fpg goods,a.fstkcode room,b.fg subs,b.fqty needs,c.fg subs_1,c.fqty needs_1 into # from
(select distinct fpg,fstkcode from #t1 a
cross join #t2 b) a
left join #t1 b
on a.fpg=b.fpg
left join #t2 c
on a.fstkcode=c.fstkcode and b.fg=c.fg
--order by a.fstkcode

select goods,room,min(needs_1/needs) from # a where not exists(select 1 from # where goods=a.goods and room=a.room and subs_1 is null or (subs_1=a.subs_1 and needs_1<needs)) group by goods,room order by room,goods
/*
a s1 1
b s2 1

*/

drop table #t1
drop table #t2
drop table #
antsing_2008 2008-09-03
  • 打赏
  • 举报
回复
为什么还是没人来帮忙下呢,大虾们
cxmcxm 2008-09-02
  • 打赏
  • 举报
回复
如果只是单层bom,按比例求出最小可组多少件的部件数,就是仓库的最大可组数.
如果存在使用相同部件的情况,则可能有多种组合.
antsing_2008 2008-09-02
  • 打赏
  • 举报
回复
大家帮帮忙,高分等你拿
antsing_2008 2008-09-02
  • 打赏
  • 举报
回复
按5楼的数据结果是
fstkcode fpg 件数
s1 a 1
s1 b 0
因为a1是公用分件
13楼说的问题其实可以忽略,因为你可以按顺序去组,演示数据就按先组A扣库存然后组B
wzy_love_sly 2008-09-01
  • 打赏
  • 举报
回复
结果是什么?
wzy_love_sly 2008-09-01
  • 打赏
  • 举报
回复
不是s1库能组个a,
s2能组个b?哪个是公用
antsing_2008 2008-09-01
  • 打赏
  • 举报
回复
公用分件问题还是没考虑到,整这题是因为同事说不用循环解决不了
antsing_2008 2008-09-01
  • 打赏
  • 举报
回复
我知道,就先比如先组A试试就可以了,7楼的也不对
等不到来世 2008-09-01
  • 打赏
  • 举报
回复
如果要考虑公共组件,那么结果将不是唯一的。
比如可能先组b,再组a……
加载更多回复(7)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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