MSSQL ERP 数量均摊

先贴上参考学习帖子。感谢前辈的文摘

需求背景

以自己的学习结果做了一个调整,防止有小伙伴看不懂CTE

以销售订单为例

行号物料编码数量
1A001100
2A001200
3A00130
4B001200
5B001280

库存数据

行号物料编码库存数量
1A001280
2B001500

希望看到的结果

行号物料编码数量库存数量
1A001100100
2A001200180
3A001300
4B001200200
5B002280300

DECLARE @SalOrder TABLE 
(
  FMaterialId NVARCHAR(255),
  FQty  DECIMAL(18,10)
)
 
insert into @SalOrder values
('A001',100),
('A001',200),
('A001',30),
('B001',200),
('B001',280)

DECLARE @StockQty TABLE 
(
  FMaterialId NVARCHAR(255),
  FQty  DECIMAL(18,10)
)
 
insert into @StockQty values
('A001',280),
('B001',500)

-- 先把数据拼接在一起
SELECT 
	ROW_NUMBER() OVER(ORDER BY T.FMaterialId) AS FID
	,ROW_NUMBER() OVER(PARTITION BY T.FMaterialId ORDER BY T.FMaterialId) AS FRow
	,T.FMaterialId '物料ID',T.FQty '订单数量',T1.FQty AS '库存数'
	,CAST(0 AS DECIMAL(18,10)) AS '预留需求汇总数'
	,CAST(0 AS DECIMAL(18,10)) AS '预留计算结存数'
	,CAST(0 AS DECIMAL(18,10)) AS '预留分摊结果'
	INTO #Temp
FROM @SalOrder T
	JOIN @StockQty T1 ON T.FMaterialId = T1.FMaterialId

-- 开始处理汇总数
UPDATE T
	SET T.预留需求汇总数 = (SELECT SUM(X.订单数量) FROM #Temp X WHERE X.物料ID = T.物料ID AND X.FID <= T.FID),
	T.预留计算结存数 = T.库存数 - (SELECT SUM(X.订单数量) FROM #Temp X WHERE X.物料ID = T.物料ID AND X.FID <= T.FID)
FROM #Temp T

-- 初步处理分摊结果
UPDATE T
	SET T.预留分摊结果 = 
		case when T.预留计算结存数 >= 0 then T.订单数量
		   when T.预留计算结存数 <0 and ABS(T.预留计算结存数) <= T.订单数量  then T.订单数量 + T.预留计算结存数
		   when T.预留计算结存数 < 0 and ABS(T.预留计算结存数) > T.订单数量 then 0 END
FROM #Temp T

-- 最终处理,预留剩余的需要加上去,也就是当尾行大于0的时候需要处理
UPDATE T
	SET T.预留分摊结果 = T.预留分摊结果 + T.预留计算结存数
FROM #Temp T
WHERE T.预留计算结存数 >= 0 AND FID = (SELECT MAX(FID) FROM #Temp X WHERE T.物料ID = X.物料ID)

SELECT * FROM #Temp

DROP TABLE #Temp
FIDFRow物料ID订单数量库存数预留需求汇总数预留计算结存数预留分摊结果
11A001100.0000000000280.0000000000100.0000000000180.0000000000100.0000000000
22A001200.0000000000280.0000000000300.0000000000-20.0000000000180.0000000000
33A00130.0000000000280.0000000000330.0000000000-50.00000000000.0000000000
41B001200.0000000000500.0000000000200.0000000000300.0000000000200.0000000000
52B001280.0000000000500.0000000000480.000000000020.0000000000300.0000000000

最终的分摊结果与我们希望一致。
PS:测试的时候可以把Update一行行注释来看效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ok060

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值