2012-03-21 139 views
0

我有一個函數可以產生幾行作爲字符串值。值如下:將行轉換爲列SQL Server,T-SQL

[12*02] 
[12*03] 
[12*04] 
[12*05] 
[12*06] 
[12*07] 
[12*08] 
[12*09] 
[12*10] 
[12*11] 
[12*12] 
[12*13] 
[12*14] 
[12*15] 

這些值實際上是不同的行。所以[12 * 01]是第1行,[12 * 02]是第2行,依此類推。 我想將這些值用作列標題。所以[12 * 01]是第1列,[12 * 02]是第2列,依此類推。我會用一個數據透視表,但是這個字符串每次都會改變,這就是我不想使用pivot的原因。這不是一個大學家庭作業的任務,我只想到使用RANK和行號功能。

任何幫助,將不勝感激。

回答

1

您仍然必須使用pivot(或aggregate_function(CASE)手動編碼的變體),但是您可以動態執行此操作。創建一個接受逗號分隔的列標題列表的過程,併爲varchar變量中的pivot設置sql代碼,並在該列表中放置佔位符。這使您可以將數據透視表保存在表中,或者將視圖定義讀入varchar變量以幫助您進行語法檢查。之後,用實際列表替換佔位符並執行透視。

create proc ExecPivot (@PivotedList nvarchar(max)) 
as 
    set nocount on 

    declare @sql nvarchar(max) 
    set @sql = N' 
     select ColumnList, [PLACEHOLDER] 
     from TableA 
     pivot 
     (
      min(Value) 
      for Key in ([PLACEHOLDER]) 
     ) a' 
    set @sql = REPLACE(@sql, '[PLACEHOLDER]', @PivotedList) 
    print @sql 
    exec sp_executesql @sql 

對於concatenating many rows into a single text string有一個很好的參考。你可能需要它@PivotedList參數。

我希望我不是完全的標誌:-)