CHill60
Для этого я решил использовать рекурсивный CTE (Common Table Expression) в сочетании с другим CTE
;with cte1 as
(
select item, quantityrequired, maxquantity,
cast(QuantityRequired / maxquantity as integer) as wholes, QuantityRequired % MaxQuantity as partials
from #test
)
,cte2 as
(
SELECT item, maxquantity, wholes, 'base ' as w from cte1
UNION ALL
SELECT item, maxquantity, wholes - 1, 'recur' as w
FROM cte2 WHERE wholes > 1
)
SELECT item, MaxQuantity as QuantityRequired
from cte2
union all
SELECT item, partials as QuantityRequired
from cte1 where partials > 0
order by Item, QuantityRequired desc
Edit - хотел объяснить это до того, как я его отправил!
Первый CTE определяет, сколько строк мне нужно,
wholes
это количество строк, в которых я могу использовать максимально допустимое количество (обязательно / макс.),
partials
это то, что осталось (требуется mod max)
2-й CTE генерирует все необходимые "целые" строки - я включил этот столбец w, чтобы помочь вам увидеть, что происходит (если вы хотите включить его в select) - полное объяснение рекурсивных CTE можно найти по адресу
Рекурсивных обобщенных табличных выражениях объяснил - необходимые для SQL[
^]
Окончательный выбор принимает все эти "целые" строки и объединения с оставшимся "частичным" значением для каждого элемента- если таковой имеется. Обратите внимание на использование Союза
все таким образом, дубликаты "целых" строк не удаляются