2015-02-11 74 views
2

我有一個鍵值對錶。我已經創建了一個使用動態sql的腳本來正確地轉換表格。但是,這些密鑰具有不同的數據類型。有沒有一種方法可以在動態數據透視期間或之後動態地投射鍵?我可以將數據類型放在每個鍵的相同鍵值對錶中,也可以將其存儲在可通過鍵鏈接的單獨表中。我可以使用不同數據類型從鍵值表創建動態數據透視查詢嗎?

使用動態sql是因爲我不會總是知道列。總會有一個數據類型。

起始表的示例:

sampleid  key value datatype 
------------------------------------ 
1001  Name Andrew varchar(50) 
1001  Date 20150129 datetime 
1002  Name Anna  varchar(50) 
1002  Date 20150129 datetime 

最終結果將是這樣以名稱爲nvarchar及日期日期時間: 該腳本是創建成一個考慮到該存儲的過程。該視圖正通過外部應用程序(如SAS和Olive)從視圖中獲取數據類型。當然,這並不理想,但這正是我嘗試過的任務!

sampleid name  date 
----------------------------- 
1001  Andrew 20150129 
1002  Anna  20150129 
+0

'Anna'不是一個日期時間,所以你將不能夠來轉換。你想要什麼樣的最終結果?您可以在不轉換數據的情況下調整它,爲什麼需要轉換它? – Taryn 2015-02-11 20:10:11

+0

感謝@bluefeet!我已更正並添加了一些更多信息。 – 2015-02-11 20:35:57

+0

如果您需要能夠動態創建此功能,那麼您將無法在視圖中執行此操作。動態SQL只能在存儲過程中運行。 – Taryn 2015-02-11 20:38:20

回答

3

爲此,您可以使用動態SQL,你只需要箱「新列」作爲一個字符串的兩個單獨的列表。一個列表將包括轉換爲您的數據類型的列名稱,第二個列表將用於PIVOT功能。

的代碼將是:

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

-- get the list of [key] items for the columns used in the PIVOT 
select @cols 
    = STUFF((SELECT ', ' + QUOTENAME([key]) 
      from yourtable 
      group by [key], datatype   
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

-- get the list of columns for the final select 
-- include a conversion of the columns into the correct datatype 
select @colsConversion 
    = STUFF((SELECT ', cast(' + QUOTENAME([key]) +' as '+ datatype+') as ' + QUOTENAME([key]) 
      from yourtable 
      group by [key], datatype   
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

-- the converted columns go in the final select list 
-- while the other @cols are used inside the PIVOT 
set @query = 'SELECT sampleid, ' + @colsConversion + ' 
      from 
      (
       select sampleid, [key], value 
       from yourtable 
      ) x 
      pivot 
      (
       max(value) 
       for [key] in (' + @cols + ') 
      ) p; ' 

exec sp_executesql @query; 

SQL Fiddle with Demo

+0

這太棒了!謝謝! – 2015-02-16 19:17:33

相關問題