2012-01-27 15 views
1

テーブル上でピボットを実行しようとして問題が発生しました。私が欲しいもののサンプルは以下の通りです。集計のないSQL Server 2008ピボット

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] 

は今、これは単なる一例であり、実際の場合には、何百ものがあります複数のバーコードを持つ製品

私は次のクエリを使用しようとしましたが、私が得たのは、両方のバーコード列でnullでした。

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

@ミスバ - サンプルデータを使用しています。ピボット演算子を使用した行以外のすべてを照会すると、結果が得られますか? –

+0

@Misbah Yanus - サンプルデータを作成するために使用されたすべてのSQLと予期される結果を生成するクエリを投稿しました。 –