#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
, вы бы в конечном итоге упаковали целое дополнительное количество, когда значения округлятся красиво.