Да, это возможно, но требуется динамический SQL;
Вы можете увидеть связанное решение, которое может быть расширено для вашей проблемы здесь: Сводки с динамическими столбцами в SQL Server 2005
Воспроизведено частично ниже, так как я думаю, что этоочень круто:
Этот запрос работает как в SQL Server 2000, так и в 2005 году. Он эффективен, но некоторым он может не понравиться, поскольку он использует одну и ту же переменную (@cols) с обеих сторон назначения.Другое решение, которое работает только на SQL Server 2005, - это использование XML PATH.
DECLARE @cols NVARCHAR(2000)
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t2.ColName
FROM Table1 AS t2
ORDER BY '],[' + t2.ColName
FOR XML PATH('')
), 1, 2, '') + ']'
Этот список столбцов используется дважды в сводном запросе, который мы стремимся построить.Как только он используется в списке столбцов, которые мы хотим получить, и как только он используется в качестве списка значений, которые должны стать столбцами.Построив этот список столбцов выше, мы можем просто объединить его с отсутствующими частями сводного запроса, например:
DECLARE @query NVARCHAR(4000)
SET @query = N'SELECT tID, '+
@cols +'
FROM
(SELECT t2.tID
, t1.ColName
, t2.Txt
FROM Table1 AS t1
JOIN Table2 AS t2 ON t1.ColId = t2.ColID) p
PIVOT
(
MAX([Txt])
FOR ColName IN
( '+
@cols +' )
) AS pvt
ORDER BY tID;'
Выполнение этого с помощью
EXECUTE(@query)
даст нам ожидаемый результат: таблица, которая поворачивается и показывает столбцы, указанные в таблице:
tID Country Day Month
----------- ---------- ---------- ----------
1 US 4 July
2 US 11 Sep
3 US 25 Dec