2013-03-13 23 views
2

我想知道如果下面的SQL Server可以做2012樞軸2個colums留下其他列不變的表

,我有以下數據:

Product_ID Date  Attribute Value 
------------------------------------------- 
10025135  2009 Colour  Red 
10025135  2009 Size   20 cm 
10025135  2009 Material  Steel 
10025135  2010 Colour  Green 
10025135  2010 Size   NULL 
10025135  2010 Material  Alloy 
10025136  2009 Colour  Black 
10025136  2009 Size   30cm 
10025136  2009 Material  NULL 

我想檢索數據,以便它們顯示如下:

Product_ID Date Colour Size  Material 
------------------------------------------------- 
10025135  2009 Red  20 cm Steel 
10025135  2010 Green  NULL  Alloy 
10025136  2009 Black  30 cm NULL 

我試着將它們轉換爲沒有成功。

回答

4
SELECT Product_ID, Date, Colour, Size, Material 
FROM 
     (
      SELECT Product_ID, Date, Attribute, Value 
      FROM Table1 
     ) org 
     PIVOT 
     (
      MAX(Value) 
      FOR Attribute IN (Colour, Size, Material) 
     ) pivotHeader 

輸出

╔════════════╦══════╦════════╦════════╦══════════╗ 
║ PRODUCT_ID ║ DATE ║ COLOUR ║ SIZE ║ MATERIAL ║ 
╠════════════╬══════╬════════╬════════╬══════════╣ 
║ 10025135 ║ 2009 ║ Red ║ 20 cm ║ Steel ║ 
║ 10025135 ║ 2010 ║ Green ║ (null) ║ Alloy ║ 
║ 10025136 ║ 2009 ║ Black ║ 30cm ║ (null) ║ 
╚════════════╩══════╩════════╩════════╩══════════╝ 

這樣做的另一種方式是通過使用MAX()CASE

SELECT Product_ID, DATE, 
     MAX(CASE WHEN Attribute = 'Colour' THEN Value END) Colour, 
     MAX(CASE WHEN Attribute = 'Size' THEN Value END) Size, 
     MAX(CASE WHEN Attribute = 'Material' THEN Value END) Material 
FROM Table1 
GROUP BY Product_ID, DATE 
+0

你是如何產生甜蜜看產出表? – AaronLS 2013-03-13 03:12:24

1

您可以使用PIVOT函數來獲得期望的結果執行。這將採用attribute列中的行值並將它們轉換爲列。

這樣做時要考慮的主要問題是您是否將有已知或未知數量的attribute值。

如果值是事先已知的,那麼你可以硬編碼使用靜態PIVOT值:

select product_id, 
    Colour, 
    Size, 
    Material 
from 
(
    select product_id, date, attribute, value 
    from yourtable 
) src 
pivot 
(
    max(value) 
    for attribute in (Colour, Size, Material) 
) piv; 

SQL Fiddle with Demo

但是,如果attribute列的值未知或需要動態,那麼您將需要實現動態SQL。動態SQL將獲取要在SQL字符串中使用的列的列表。

代碼即可獲得列的列表將與此類似:

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(attribute) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

此查詢的結果是:

[Colour],[Material],[Size] 

這對執行產生的attributes名單,應該是轉換爲列,並將它連接到最終執行的字符串中。您對動態SQL數據庫的代碼是:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(attribute) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query = 'SELECT product_id,' + @cols + ' 
      from 
      (
       select product_id, date, attribute, value 
       from yourtable 
      ) x 
      pivot 
      (
       max(value) 
       for attribute in (' + @cols + ') 
      ) p ' 

execute(@query) 

請參閱SQL Fiddle with Demo

結果兩個疑問是:

| PRODUCT_ID | COLOUR | SIZE | MATERIAL | 
------------------------------------------- 
| 10025135 | Red | 20 cm | Steel | 
| 10025136 | Black | 30cm | (null) | 
| 10025135 | Green | (null) | Alloy |