2012-03-21 122 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参数。

我希望我不是完全的标志:-)