Что-то вроде этого, вероятно, сработает:
Тестовые данные
CREATE TABLE #tbl
(
Y1 INT,
Y2 INT,
Y3 INT,
Y4 INT,
Y5 INT
)
INSERT INTO #tbl
VALUES
(1,2,3,4,9),
(1,6,9,3,6),
(2,2,6,7,6)
Тогда нам нужно знать, сколько там X столбцов.Это получает столбцы:
DECLARE @nbrOf INT=(SELECT COUNT(*) FROM #tbl)
DECLARE @cols VARCHAR(MAX)
DECLARE @colsWithName VARCHAR(MAX)
;WITH Nbrs ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM Nbrs WHERE n <@nbrOf )
SELECT
@cols = COALESCE(@cols + ','+QUOTENAME(n),
QUOTENAME(n)),
@colsWithName = COALESCE(@colsWithName + ','+QUOTENAME(n)+' AS X'+CAST(n AS VARCHAR(10)),
QUOTENAME(n)+' AS X'+CAST(n AS VARCHAR(10)))
FROM
Nbrs
Затем мы собираемся сделать некоторые динамические SQL с опорой.Вот так:
DECLARE @query NVARCHAR(4000)=
N'SELECT
'+@colsWithName+'
FROM
(
SELECT
ROW_NUMBER() OVER(ORDER BY tbl.Y1) AS RowNbr,
tbl.Y1,
tbl.Y2,
tbl.Y3,
tbl.Y4,
tbl.Y5
FROM
#tbl AS tbl
) AS p
UNPIVOT
(
Value FOR Name IN
(Y1, Y2, Y3, Y4, Y5)
) AS unpvt
PIVOT
(
MAX(Value)
FOR RowNbr IN('+@cols+')
) AS pvt'
EXECUTE(@query)
Тогда в моем случае я опущу временную таблицу
DROP TABLE #tbl