SQL Server 2008不带聚合的数据透视表

时间:2012-01-27 03:10:08

标签: sql sql-server sql-server-2008 pivot aggregation

我在尝试在桌面上执行数据透视时遇到问题。我想要的样本如下所示。

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 个答案:

答案 0 :(得分: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