2012-01-27 3 views
1

У меня возникла проблема с попыткой выполнить опорную точку на столе. Образец того, что я хочу, показан ниже.SQL Server 2008 Pivot без агрегации

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] 

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

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

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

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

ответ

1

Никакой путь к 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 
+0

Спасибо за это Купер. Я попробовал запрос, который вы написали, и я получаю штрих-коды под столбцом Barcode1, но в столбце Barcode2 он показывает все NULL. –

+0

@Misbah - Я использую ваши данные образца, отлично работал для меня. Получаете ли вы полученные результаты при запросе всего, кроме строки с помощью оператора поворота? –

+0

@Misbah Yanus - я разместил все sql, используемые для создания ваших данных образца и запроса, которые будут давать ожидаемые результаты. –