Здесь важна не группировка или модуль / деление, а тот факт, что вам нужно выполнить агрегирование (сумму) и затем снова проанализировать данные. На самом деле строк "Red 2" не существует, их нужно каким-то образом создавать.
Для SQL Server 2005+ я бы, вероятно, использовал функцию "взрыва":
CREATE FUNCTION dbo.CreateBuckets
(
@Num int,
@MaxPerGroup int
)
RETURNS TABLE
AS RETURN
WITH First_CTE AS
(
SELECT CASE
WHEN @MaxPerGroup < @Num THEN @MaxPerGroup
ELSE @Num
END AS Seed
),
Sequence_CTE AS
(
SELECT Seed AS [Current], Seed AS Total
FROM First_CTE
UNION ALL
SELECT
CASE
WHEN (Total + @MaxPerGroup) > @Num THEN (@Num - Total)
ELSE @MaxPerGroup
END,
Total + @MaxPerGroup
FROM Sequence_CTE
WHERE Total < @Num
)
SELECT [Current] AS Num
FROM Sequence_CTE
Затем в основном запросе сначала группируйте (суммируйте) данные, а затем используйте функцию сегмента:
WITH Totals AS
(
SELECT Name, SUM(Quantity) AS Total
FROM Table
GROUP BY Name
)
SELECT Name, b.Num AS QuantityInPackage
FROM Totals
CROSS APPLY dbo.CreateBuckets(Total, 2) b
Это должно работать для любого размера сегмента, не должно быть 2 (просто измените параметр).