Сводная таблица SQL Server 2008 без агрегирования - PullRequest
1 голос
/ 27 января 2012

Я столкнулся с проблемой, пытаясь выполнить поворот на столе.Пример того, что я хочу, показан ниже.

ProductBarcode    ProductID
--------------    ---------
1000              P1
1001              P1
1002              P2
1003              P3
1004              P4
1005              P4

Теперь я хочу преобразовать приведенную выше таблицу в нечто, как показано ниже.

ProductID    Barcode1    Barcode2
---------    --------    --------
P1           1000        1001
P2           1002        
P3           1003        
P4           1004        1005

Я пытался разобраться с этимследующий запрос, но он не дал требуемых результатов:

SELECT 
  [r1].[productID],
  [r1].[Productbarcode] as Barcode1,
  [r2].[ProductBarcode] as Barcode2
FROM products as r1 right JOIN products as r2 on r1.[productID] = r2.[productID]

Теперь это всего лишь пример, и в действительности существуют сотни продуктов, которые имеют несколько штрих-кодов.

IЯ даже пытался использовать следующий запрос, но все, что я получил, было пустым в обоих столбцах штрих-кода.

SELECT productID,[barcode1],[barcode2]
FROM
(SELECT barcode, productID
FROM products) as TableToBePivoted
PIVOT
(MAX(barcode)
FOR barcode IN ([barcode1], [barcode2])
) AS PivotedTable;

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 27 января 2012

Нет пути к PIVOT без агрегирования.

Но вот как получить то, что вы хотите, введите столько столбцов (штрих-кодов), сколько хотите:

CREATE TABLE #table1(
    ProductBarcode VARCHAR(10),
    ProductID  VARCHAR(10)
);

INSERT INTO #table1(ProductBarcode, ProductID)
VALUES
('1000' ,'P1'),
('1001' ,'P1'),
('1002' ,'P2'),
('1003' ,'P3'),
('1004' ,'P4'),
('1005' ,'P4');


WITH T AS(
    SELECT 'Barcode' + RTRIM(LTRIM(STR( ROW_NUMBER() OVER(PARTITION BY ProductID ORDER BY  ProductBarcode)))) AS BarcodeNum,
           ProductBarcode, 
           ProductID    
           FROM #table1
) 
SELECT * FROM T
PIVOT(MAX(ProductBarcode) FOR BarcodeNum IN([Barcode1], [Barcode2])) P

Результаты:

ProductID  Barcode1   Barcode2
---------- ---------- ----------
P1         1000       1001
P2         1002       NULL
P3         1003       NULL
P4         1004       1005
...