Это ЧЕТЫРЕ (4) пошаговых решения
- адаптировано с большим почтением от https://dba.stackexchange.com/questions/119844/how-to-pivot-without-fixed-columns-in-tsql
- (1) Объявить переменные
DECLARE
@cols AS NVARCHAR(MAX)
,@query AS NVARCHAR(MAX)
;
- (2) Объединить список новых заголовков столбцов, используя FOR XML PATH и STUFF:
- смотрите, где SecID <> 2 (вы можете изменить это)
SELECT @cols =
STUFF(
(SELECT DISTINCT
',' + QUOTENAME(t.testkey + 'KeyResponse')
FROM qandrResponse as r
Left Join qandrTest as t
On r.testID = t.testID
Where SecID <> 2 -- you may want to filter differently
Order By ',' + QUOTENAME(t.testkey + 'KeyResponse')
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,''
);
-- Select @cols; -- uncomment to see the list, drag right side open to see full list
- (3) Создайте полную строку sql, которая будет выполняться, используя @cols сверху
set @query
= N'SELECT CID, ' + @cols + N'
From (SELECT
r.CID
,t.testkey + ''' + 'KeyResponse' + N''' as Keys
,responseText
FROM qandrResponse as r
Left Join qandrTest as t
On r.testID = t.testID
) x
Pivot (
max(responseText) for Keys IN (' + @cols + N')
) as p';
-- Select @query; -- uncomment to see sql, prettyprint with http://www.dpriver.com/pp/sqlformat.htm
- (4) Выполнить запрос
exec sp_executesql @query
- Результаты
--CID T11KeyResponse T1KeyResponse T3KeyResponse T4KeyResponse
--92 T11Text T1Text T3Text T4Text
--93 Myresponse NULL vendor NULL