2013-10-30 55 views
4

有人可以幫我轉換下面的mssql請嗎?MSSQL動態透視列值到列標題

ID | PROPERTY_NAME | PROPERTY_VALUE 
1 |  name1  |  value 
1 |  name2  |  value 
1 |  name3  |  value 
2 |  name4  |  value 
2 |  name2  |  value 
3 |  name6  |  value 
.. 

PROPERTY_NAME & PROPERTY_VALUE是頭,有多個ID '屬性'

我想將其轉換爲:

ID | NAME1 | NAME2 | NAME3 | NAME4 | NAME5 | NAME6 | nameETC... 
1 | value | value | value |  |  |  | valueETC... 
2 |   | value |  | value |  |  | valueETC... 
3 |   |  |  |  |  | value | valueETC... 
.. 

凡NAME1 | NAME2 | NAME3等現在是列標題。

我在猜測一個數據透視表和「從MycoolTable中選擇不同的PROPERTY_NAME」,但似乎無法將兩者結合在一起。

這是據我得到:(無SERVER_ID)列,到處都是空)顯然我傻:d

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

select @cols = STUFF((SELECT distinct 
      ',' + QUOTENAME(PROPERTY_NAME) 
       FROM [BSARA_DW_DB].[dbo].[SERVER_PROPERTY] 
       FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
       ,1,1,''); 

SET @query = 'SELECT '+ @cols + ' from 
     (
      SELECT SERVER_ID, PROPERTY_NAME, PROPERTY_CHAR_VAL 
      FROM [BSARA_DW_DB].[dbo].[SERVER_PROPERTY] 
     ) x 
     pivot 
     (
      MAX(SERVER_ID) 
      for PROPERTY_CHAR_VAL in (' + @cols + ') 
     ) p '; 

execute(@query) 

非常感謝, 麥克

+2

你到目前爲止嘗試過什麼?你可以在SQL小提琴http://sqlfiddle.com創建一些東西,你提到數據透視你有沒有嘗試過任何東西:http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx – Kairan

+0

編輯與我試過 – Salakar

回答

5

與您當前的問題查詢與行:

MAX(SERVER_ID) 

你想顯示PROPERTY_CHAR_VAL每個PROPERTY_NAME代替。 SERVER_ID將作爲列的最終結果的一部分。

有時,當你與PIVOT工作是比較容易通過硬編碼類似值先寫代碼:

select id, name1, name2, name3, name4 
from 
(
    select id, property_name, property_value 
    from yourtable 
) d 
pivot 
(
    max(property_value) 
    for property_name in (name1, name2, name3, name4) 
) piv; 

SQL Fiddle with Demo

一旦你有一個正確的邏輯版本,那麼你可以將它轉換爲動態SQL來獲得結果。這將創建一個將被執行的sql字符串,它將包含所有新的列名稱。

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

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

set @query = 'SELECT id, ' + @cols + ' 
      from 
      (
       select id, property_name, property_value 
       from yourtable 
      ) x 
      pivot 
      (
       max(property_value) 
       for property_name in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query; 

參見SQL Fiddle with Demo。兩者都會給出結果:

| ID | NAME1 | NAME2 | NAME3 | NAME4 | NAME6 | 
|----|--------|--------|--------|--------|--------| 
| 1 | value | value | value | (null) | (null) | 
| 2 | (null) | value | (null) | value | (null) | 
| 3 | (null) | (null) | (null) | (null) | value | 
+0

你是先生是最好的:@)我是親密的(看到第一篇文章編輯) - 再次感謝 – Salakar

+1

@ user2938161你是非常接近你的查詢,樞軸可以是一個痛苦有點得到正確這就是爲什麼硬編碼有時更容易。 :) – Taryn