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