Просто выполните UNPIVOT
, затем PIVOT
.Вот полный рабочий пример:
DROP TABLE IF EXISTS #rdata;
CREATE TABLE #rdata
(
[Months] VARCHAR(12)
,[KPI_1] INT
,[KPI_2] INT
,[KPI_3] INT
);
INSERT INTO #rdata ([Months], [KPI_1], [KPI_2], [KPI_3])
VALUES ('Jan-18 ', 1, 2, 3)
,('Feb-18 ', 4, 5, 6)
,('Mar-18 ', 7, 8, 9)
,('Apr-18 ', 10, 11, 12)
,('Aug-18 ', 13, 14, 15)
DECLARE @DynammicTSQLStatement NVARCHAR(MAX)
,@DynamicPIVOTColumns NVARCHAR(MAX);
SET @DynamicPIVOTColumns = STUFF
(
(
SELECT ',[' + CAST([Months] AS VARCHAR(12)) + ']'
FROM #rdata
GROUP BY [Months]
ORDER BY [Months]
FOR XML PATH('') ,TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,1
,''
);
SET @DynammicTSQLStatement = N'
SELECT *
FROM #rdata
UNPIVOT
(
[value] FOR [KPIs] IN ([KPI_1], [KPI_2], [KPI_3])
) UNPVT
PIVOT
(
MAX([value]) FOR [Months] IN (' + @DynamicPIVOTColumns + ')
) PVT'
EXEC sp_executesql @DynammicTSQLStatement;
Обратите внимание, что когда я создаю динамические столбцы на основе столбца месяца, я упорядочиваю посамо значение месяцаЕсли вы хотите иметь / сортировать месяцы в хронологическом порядке, вам нужно хранить данные в другом формате (например, 2018-01, 2017-10) для сортировки по другому столбцу (например, первичный ключ или что-то в этом роде).