Вот решение с использованием SQL Pivot.
Как создать пример набора данных:
IF OBJECT_ID('SourceTable') Is Not Null Drop Table SourceTable
Create Table SourceTable (
COL_IDX int,
ROW_IDX int,
VALUE nvarchar(100)
)
Insert into SourceTable (COL_IDX, ROW_IDX, VALUE)
Values
(1,1,'after 45 min')
,(2,1,'98')
,(3,1,'95')
,(4,1,'99')
,(5,1,'1.1')
,(6,1,'12')
,(1,2,'after 60 min')
,(2,2,'98')
,(3,2,'96')
,(4,2,'101')
,(5,2,'1.4')
,(6,2,'12')
Как выполнить поворот данных:
SELECT ROW_IDX AS MyIndex, [1],[2],[3],[4],[5],[6]
FROM
(SELECT * FROM SourceTable) AS q
PIVOT (
MAX(Value)
FOR COL_IDX IN ([1],[2],[3],[4],[5],[6])
) AS PivotedTable
Результат:
MyIndex 1 2 3 4 5 6
1 after 45 min 98 95 99 1.1 12
2 after 60 min 98 96 101 1.4 12
Сводка в SQL используется агрегатная функция; здесь я использовал «max», но это на самом деле не имеет значения, потому что для комбинации ROW_IDX / COL_IDX нет нескольких значений.
Похоже, вам может понадобиться динамически генерировать ваши столбцы, и в этом случае вы можете использовать Dynami c SQL, чтобы получить тот же результат:
DROP TABLE IF EXISTS #headings
SELECT DISTINCT COL_IDX='[' + Cast(COL_IDX AS NVARCHAR(6)) + ']'
INTO #headings
FROM SourceTable
DECLARE @Columns nvarchar(1000) = (SELECT string_agg(COL_IDX, ', ') FROM #headings)
DECLARE @MyCommand nvarchar(max) =
'SELECT *
FROM SourceTable
PIVOT (
MAX(VALUE)
FOR COL_IDX IN (~Columns~)
) PivotTable'
SET @MyCommand = Replace(@MyCommand, '~Columns~', @Columns)
EXEC (@MyCommand)
DROP TABLE IF EXISTS #headings