Как найти наименьшее кратное полю A, которое равно или больше, чем поле B

#sql #sql-server #tsql

Вопрос:

Я ищу способ найти наименьшее кратное (включая * 1) количество упаковок, которое больше или равно порядковому количеству (см. Код ниже). Функционально каждое заказанное количество должно быть кратно количеству товара в упаковке.

Так,

Если количество заказов = 3 и количество упаковки = 5, количество заказов должно стать 5.

Если количество заказов = 5 и количество упаковки = 3, количество заказов должно стать 6.

И т.д…

 SELECT VmiItemUpdates.OrdQty, VmiItemPackagingQuantities.Quantity as PackingQuantity 
FROM vm.VmiItemUpdates 
INNER JOIN vm.VmiItemPackagingQuantities ON VmiItemUpdates.[itemcode] = VmiItemPackagingQuantities.[itemcode]
 

Но я изо всех сил пытаюсь найти логический метод для этого в TSQL. Может ли кто-нибудь дать мне подсказку для подхода?

Ответ №1:

найдите соотношение OrdQty / PackingQuantity и используйте CEILING() для округления до ближайшего целого числа и умножения обратно с количеством упаковки

 NewOrdQty = CEILING(OrdQty * 1.0 / PackingQuantity) * PackingQuantity 
 

Ответ №2:

Одним из методов было бы использование модуля для добавления разницы между PackingQuantity и по модулю к Ordqty .

Для значения 5 для OrdQty и 3 для PackingQuantity вас требуется значение 6 . Результат по OrdQty модулю PackingQuantity 2 -это то , что вы затем вычитаете из PackingQuantity отдачи 1 и , наконец, добавляете это к OrdQty отдаче 6 :

 SELECT OrdQty,
       PackingQuantity,
       OrdQty   PackingQuantity - ISNULL(NULLIF(OrdQty % PackingQuantity,0),PackingQuantity) AS RequiredOrdQty
FROM (VALUES(3,5),
            (5,3),
            (7,4),
            (3,10),
            (17,7))V(OrdQty,PackingQuantity)
 

(Отвратительные) ISNULL / NULLIF s присутствуют , так как значения x % x 0 нет x ; если бы мы не «поменялись местами» 0 , чтобы быть x , вы бы в конечном итоге упаковали целое дополнительное количество, когда значения округлятся красиво.