关于自动分配数量的一个sql

crazy_boom 2015-12-21 01:28:48
Sql2008r2 我知道用动态sql可以处理 但是想了半天也没想好

--库存表有如此数量 如何按序列生成所需要的数量
Create table #tb
(bh char(2) null ,
xh int ,
sl int
)
insert into #tb
select '12',1,2 union
select '12',2,3 union
select '12',3,10 union
select '13',4,12 union
select '13',5,8 union
select '14',6,100 union
select '14',7,10

--编号12的数量要18个 编号13的要15个 编号14的要15个
--如何按序列提供可需要的数量
--想要的结果是

bh xh sl
12 1 2
12 2 3
12 3 10
13 4 12
13 5 3
14 6 15


...全文
420 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2015-12-26
  • 打赏
  • 举报
回复
 Create table #tb 
 (bh char(2) null ,
  xh int    ,
  sl int
  )
 insert into #tb
 select '12',1,2 union 
 select '12',2,3 union 
 select '12',3,10 union 
 select '13',4,12 union 
 select '13',5,8 union 
 select '14',6,100 union 
 select '14',7,10  
 GO
 
 DECLARE @bh CHAR(2)='13',@sl INT=15
 ;WITH tb
 AS
 (
 SELECT *,(SELECT SUM(sl) FROM #tb WHERE bh=a.bh AND xh<=a.xh) AS SumSl FROM #tb AS a WHERE a.bh=@bh AND EXISTS (SELECT 1 FROM #tb WHERE bh=a.bh AND xh<a.xh HAVING ISNULL(SUM(sl),0)<@sl)
 )
 SELECT bh,xh,sl=CASE WHEN tb.SumSl<=@sl THEN sl ELSE @sl+sl-SumSl END   FROM tb
 
 /*
13	4	12
13	5	3
*/
中国风 2015-12-26
  • 打赏
  • 举报
回复
计算完再去刷新库存扣减库存
中国风 2015-12-26
  • 打赏
  • 举报
回复
跟风,贴一个07年回复过的例子 http://bbs.csdn.net/topics/120010091
crazy_boom 2015-12-26
  • 打赏
  • 举报
回复
引用 7 楼 Tiger_Zhao 的回复:
求一个先进先出根据出库日期的SQL 万分感谢 参考上面的帖子中我写的SQL。 库存表的3个字段和你#tb的3个字段正好对应;你的需求表每个货号只有一条记录,更简单。
看了你的文章 感觉跟我要的结果相反。。
Tiger_Zhao 2015-12-22
  • 打赏
  • 举报
回复
求一个先进先出根据出库日期的SQL 万分感谢 参考上面的帖子中我写的SQL。 库存表的3个字段和你#tb的3个字段正好对应;你的需求表每个货号只有一条记录,更简单。
crazy_boom 2015-12-21
  • 打赏
  • 举报
回复
引用 2 楼 u010192842 的回复:
http://blog.csdn.net/yole_grise/article/details/38371705 参考一下先进先出的例子。
这个方法 可以实现我的要求 能不能有一个不用循环实现的方法。。 我以前搞过一个类似的东东 可是现在忘记了。。
crazy_boom 2015-12-21
  • 打赏
  • 举报
回复
每个编号的库存 都是随机的 多少都有可能 ,需求数量也是不定的 多少都有可能。也有可能大于库存 。
道素 2015-12-21
  • 打赏
  • 举报
回复
按照你给出的结果,是每个bh可用数量都是15吧,就是下面语句的第二种

IF OBJECT_ID('tempdb..#tb') IS NOT NULL DROP TABLE #tb
Create table #tb 
 ( id INT IDENTITY(1,1),
 	bh char(2) null ,
    xh int    ,
    sl int
  )
 insert into #tb
 select '12',1,2 union 
 select '12',2,3 union 
 select '12',3,10 union 
 select '13',4,12 union 
 select '13',5,8 union 
 select '14',6,100 union 
 select '14',7,10  


 DECLARE @TotalQty INT=45
 --所有的bh共用某个数量
 SELECT  @TotalQty- isnull(p.UsedQty,0) AS AvailabelQty, CASE WHEN @TotalQty- isnull(p.UsedQty,0)>sl THEN sl ELSE @TotalQty- isnull(p.UsedQty,0) END AS GetQty
 ,* 
 FROM #tb AS t
 OUTER APPLY (SELECT SUM(sl) AS UsedQty FROM #tb WHERE id<t.id) AS p
 WHERE @TotalQty- isnull(p.UsedQty,0)>0
 -----------  每个bh有固定的数量------------
 DECLARE @RequestQty INT=15
  SELECT  @RequestQty- isnull(p.UsedQty,0) AS AvailabelQty, CASE WHEN @RequestQty- isnull(p.UsedQty,0)>sl THEN sl ELSE @RequestQty- isnull(p.UsedQty,0) END AS GetQty
 ,* 
 FROM #tb AS t
 OUTER APPLY (SELECT SUM(sl) AS UsedQty FROM #tb WHERE id<t.id AND bh=t.bh) AS p
  WHERE @RequestQty- isnull(p.UsedQty,0)>0
 
crazy_boom 2015-12-21
  • 打赏
  • 举报
回复
库存不足的就按照最大的库存分配
Yole 2015-12-21
  • 打赏
  • 举报
回复
http://blog.csdn.net/yole_grise/article/details/38371705 参考一下先进先出的例子。
xdashewan 2015-12-21
  • 打赏
  • 举报
回复
编号12怎么算也只有15个,如何能算出18个

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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