TSQL如何计算大于等于OrdQty的最小PackingQuantity整倍数
TSQL 订购量包装倍数适配实现方案
核心计算逻辑
要得到大于等于OrdQty的最小PackingQuantity整倍数,可通过向上取整运算实现,公式为:
CEILING(1.0 * OrdQty / PackingQuantity) * PackingQuantity
公式说明:
- 乘以
1.0是为了将整数运算转为浮点运算,避免TSQL整数除法自动截断小数部分的问题 CEILING函数会将小数结果向上取整为最小的大于等于当前值的整数,得到需要的包装倍数乘数- 最终用乘数乘以单包装数量,得到合规的订购量
适配后的完整SQL
SELECT VmiItemUpdates.OrdQty, VmiItemPackagingQuantities.Quantity as PackingQuantity, -- 新增调整后订购量字段 CASE WHEN VmiItemPackagingQuantities.Quantity = 0 THEN VmiItemUpdates.OrdQty -- 避免除以0异常,可按业务需求调整返回值 ELSE CEILING(1.0 * VmiItemUpdates.OrdQty / VmiItemPackagingQuantities.Quantity) * VmiItemPackagingQuantities.Quantity END AS AdjustedOrdQty FROM vm.VmiItemUpdates INNER JOIN vm.VmiItemPackagingQuantities ON VmiItemUpdates.[itemcode] = VmiItemPackagingQuantities.[itemcode]
效果验证
对应示例场景的计算结果符合业务要求:
- OrdQty=3、PackingQuantity=5 → 计算结果为5
- OrdQty=5、PackingQuantity=3 → 计算结果为6
- OrdQty=6、PackingQuantity=3 → 计算结果为6(正好为整倍数时无需调整)
可选模运算实现方案
如果不想用浮点运算,也可以通过模运算判断是否需要进位:
CASE WHEN VmiItemPackagingQuantities.Quantity = 0 THEN VmiItemUpdates.OrdQty WHEN VmiItemUpdates.OrdQty % VmiItemPackagingQuantities.Quantity = 0 THEN VmiItemUpdates.OrdQty ELSE (VmiItemUpdates.OrdQty / VmiItemPackagingQuantities.Quantity + 1) * VmiItemPackagingQuantities.Quantity END AS AdjustedOrdQty
内容的提问来源于stack exchange,提问作者MrSiezen
相关产品推荐
相关产品推荐

