一个比较难的SQL问题

horselily 2017-03-28 10:36:24
比如说,商品A有库存 15个,在库存表里是有3个批次
库存表
商品 批次 库存
A 111 2
B 222 7
C 333 6
我要把A出库8个,一般用的比较笨的办法,是用的游标来实现批号库存自动分摊,但这个方案效率比较低,有没有在不用游标的情况下,能解决库存批号自动分摊的?
...全文
170 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
horselily 2017-03-28
  • 打赏
  • 举报
回复
是的,写错了,商品都是3个A
zbdzjx 2017-03-28
  • 打赏
  • 举报
回复
1、例子中的,库存表中的三条记录,商品应该都是A吧,不应该是A、B、C。 2、自动分摊——是什么意思,平均?还是先进先出?如果是先进先出,之前有帖子回答过,可以搜搜看。
道素 2017-03-28
  • 打赏
  • 举报
回复
如果是按照一个产品一个产品的运算(用你这里的BatchID作为排序)

if not object_id(N'Tempdb..#tt') is null drop table #tt
GO
CREATE TABLE #tt(ItemID VARCHAR(10),BatchID VARCHAR(10),StockQty INT)
insert INTO #tt
SELECT 'A','111',2 UNION ALL
SELECT 'A','222',7 UNION ALL
SELECT 'A','333',6

DECLARE @OutQty INT =10

SELECT t1.ItemID,t1.BatchID,CASE WHEN ISNULL(p.p_qty,0)+t1.StockQty<=@OutQty THEN t1.StockQty ELSE @OutQty-ISNULL(p.p_qty,0) END AS UseQty  FROM #tt AS t1
OUTER APPLY (SELECT SUM(tt.StockQty) AS p_qty FROM #tt AS tt WHERE tt.ItemID=t1.ItemID AND tt.BatchID<t1.BatchID) p
WHERE ISNULL(p.p_qty,0)<=@OutQty

ItemID     BatchID    UseQty
---------- ---------- -----------
A          111        2
A          222        7
A          333        1
shoppo0505 2017-03-28
  • 打赏
  • 举报
回复
你有不同的批次号,应该只能分摊吧。我想不到其他方法 等高手解答。
RINK_1 2017-03-28
  • 打赏
  • 举报
回复
CREATE TABLE #A (商品 VARCHAR(10), 批次 VARCHAR(10), 库存 INT) INSERT INTO #A SELECT 'A','111',2 UNION ALL SELECT 'A','222',7 UNION ALL SELECT 'A','333',6 DECLARE @TOTALAMOUNT_OUT INT SET @TOTALAMOUNT_OUT=8 ;WITH CTE1 AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY 商品 ORDER BY 批次) AS RN FROM #A) SELECT *, CASE WHEN SUB_TOTAL<=@TOTALAMOUNT_OUT THEN 库存 WHEN SUB_TOTAL-库存>@TOTALAMOUNT_OUT THEN 0 WHEN SUB_TOTAL-库存<@TOTALAMOUNT_OUT AND SUB_TOTAL>@TOTALAMOUNT_OUT THEN 库存-(SUB_TOTAL-@TOTALAMOUNT_OUT) END AS AMOUNT_OUT FROM CTE1 A OUTER APPLY (SELECT SUM(库存) AS SUB_TOTAL FROM CTE1 WHERE A.商品=商品 AND RN<=A.RN) AS B
zbdzjx 2017-03-28
  • 打赏
  • 举报
回复
看一下这个:http://bbs.csdn.net/topics/392066042
horselily 2017-03-28
  • 打赏
  • 举报
回复
默认的规则就是按先进先出
horselily 2017-03-28
  • 打赏
  • 举报
回复
我的要求是不在程序里面控制,而是用单纯的SQL来解决这个库存自动分摊的,在不用游标的情况下
gw6328 2017-03-28
  • 打赏
  • 举报
回复
就是一个一个来分摊也不会太多。 而且要看你的规则。比如先进先出,后进先出。还有手工指定。这些程序上控制吧。我想你的问题是前面两种吧。 那么按顺序一个一个的来分配吧。做好记录日志。

22,206

社区成员

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

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