таблицу транспонировать в sql server? - PullRequest
0 голосов
/ 15 марта 2012

Я пытался написать sql-код для создания таблицы, которая является транспонированной для данной таблицы. Изначально у меня есть таблица с данными. Я пытаюсь создать таблицу, которая транспонирует входную таблицу, используя SQL Server Management Studio.

Пожалуйста, помогите мне ....

ввод выглядит следующим образом: tbl

вывод:

tbltr

Ответы [ 2 ]

1 голос
/ 15 марта 2012
0 голосов
/ 15 марта 2012

Что-то вроде этого, вероятно, сработает:

Тестовые данные

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...