Ce n'est pas groupement ou modulo/division qui est la partie difficile ici, il est le fait que vous devez faire un agrégat (somme) et ensuite exploser les données à nouveau. Il n'y a pas vraiment de lignes "Red 2", vous devez les créer d'une manière ou d'une autre.
Pour SQL Server 2005+, je serais probablement utiliser une fonction ne la « explosion »:
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
Puis, dans la requête principale, groupe (somme) les données, puis utilisez la fonction seau:
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
Cela devrait fonctionner pour n'importe quelle taille de baquet, ne doit pas être 2 (juste changer le paramètre).
Quelle version de SQL Server ou Informix? NTILE n'est pas tout à fait ce que vous voulez ... –
Comment obtenez-vous du premier ensemble au deuxième ensemble? Si vous 'GROUP BY', alors vous allez avoir seulement une ligne par couleur. –
Raj Plus: Exactement ma question. La quantité dans le paquet est un maximum de 2. Ainsi, il peut être 1 ou 2. Si un "Couleur" a plus de 2 éléments, alors il doit être affiché sur la ligne suivante. –