2012-03-21 6 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 и т. Д. Я бы использовал стержень, но эта строка будет меняться каждый раз, и именно поэтому я не хочу использовать опорные точки. Это не домашнее задание на колледж, и я думал только об использовании функций RANK и ряда номеров.

Любая помощь будет оценена по достоинству.

ответ

1

Вам все равно придется использовать вариант с ручным (или aggregate_function (CASE) вручную), но вы можете сделать это динамически. Создайте процедуру, принимающую список заголовков столбцов, разделенных запятыми, и подготовьте код sql для pivot в переменной varchar, помещая местозаполнители, в которых должен быть список. Это позволяет сохранять сводный код в таблице или читать определение вида в переменной 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.

Надеюсь, что я не полностью отмечен :-)