Vous pouvez agréger les données en utilisant les instructions SUM et CASE.
Utilisation de définitions de table (et quelques très minimes composées de données), voici un exemple de la façon dont vous pourriez le faire:
--** Create test tables
DECLARE @SalesLog TABLE (
SalesID int IDENTITY(1,1) NOT NULL,
MemoNo int NULL,
ProductCode int NULL,
Quantity int NULL,
Price int NULL,
ProductGroup int NULL)
DECLARE @Products TABLE(
ProductId int IDENTITY(1,1) NOT NULL,
pName nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
pSize int NULL,
pPrice int NULL,
pPackQty int NULL,
pGroup int NULL,
pCode int NULL,
pStock int NULL,
pYrStock int NULL,
pClearStock int NULL)
--** Setup test data
INSERT INTO @SalesLog (MemoNo, ProductCode, Quantity, Price, ProductGroup)
SELECT 0, 1, 500, 0, 1 UNION
SELECT 0, 2, 700, 0, 1 UNION
SELECT 0, 2, 333, 0, 1 UNION
SELECT 0, 3, 200, 0, 2 UNION
SELECT 0, 4, 125, 0, 2 ;
INSERT INTO @Products (pName, pSize, pPrice, pPackQty, pGroup, pCode, pStock, pYrStock, pClearStock)
SELECT 'Beer', 350, 1 , 1, 1, 1, 0, 0, 0 UNION
SELECT 'Beer', 650, 1 , 1, 1, 2, 0, 0, 0 UNION
SELECT 'Beer', 1000, 1 , 1, 1, 3, 0, 0, 0 UNION
SELECT 'Wine', 750, 1 , 1, 2, 4, 0, 0, 0 UNION
SELECT 'Wine', 1000, 1 , 1, 2, 5, 0, 0, 0 ;
--** Example query
SELECT t.pName AS 'Product'
, MAX(CASE WHEN t.Col = 1 THEN t.pSize END) AS 'Item Size'
, ISNULL(SUM(CASE WHEN t.Col = 1 THEN t.Quantity END),0) AS 'Quantity'
, MAX(CASE WHEN t.Col = 2 THEN t.pSize END) AS 'Item Size'
, ISNULL(SUM(CASE WHEN t.Col = 2 THEN t.Quantity END),0) AS 'Quantity'
, MAX(CASE WHEN t.Col = 3 THEN t.pSize END) AS 'Item Size'
, ISNULL(SUM(CASE WHEN t.Col = 3 THEN t.Quantity END),0) AS 'Quantity'
FROM (
SELECT pName
, pCode
, pGroup
, pSize
, sl.Quantity
, DENSE_RANK() OVER(PARTITION BY p.pGroup ORDER BY p.pSize) AS Col
FROM @Products AS p
LEFT JOIN @SalesLog AS sl
ON p.pGroup = sl.ProductGroup
AND p.pCode = sl.ProductCode
) AS t
GROUP BY t.pGroup
, t.pName
;
La requête utilise la fonction DENSE_RANK aux éléments du groupe d'une taille ensemble et pour les ordonner en ordre de taille et cela est utilisé pour déterminer dans quelle colonne les données doivent être écrites.
Bien qu'il existe un opérateur PIVOT dans SQL Server 2005 et versions ultérieures, il n'est pas très utile lorsque vous avez différents types d'en-tête de colonne (taille de l'élément et quantité dans ce cas).
Vous devrez décider du nombre maximum de tailles de produits que vous souhaitez signaler car cela est codé en dur dans la requête. Donc, si le nombre maximum de tailles de produit est 3, vous codez la requête comme indiqué ci-dessus. Si, cependant, un de vos produits a 4 tailles différentes, alors vous allez ajouter une paire supplémentaire de taille et de quantité de colonnes pour t.Col = 4 et ainsi de suite.
J'espère que cela aide.
Votre question doit être clarifiée. Je pense que je sais ce que vous demandez, mais j'ai dû le regarder longtemps. Quelle est la définition de la table? Inclure quelques rangées de données d'échantillon serait également une bonne idée. –
Je ne pense pas que vous pouvez utiliser ItemSize et Quantity deux fois. Vous devrez peut-être avoir des noms uniques pour pouvoir faire pivoter les données. –
J'ai une application basée sur foxpro qui imprime des données au même format et stocke les données de la même manière que moi. –