Транспонировать строки в столбцы, как в SQL Server (T- SQL) или SSIS без потери данных - PullRequest
1 голос
/ 19 января 2020

Прилагаются текущие и ожидаемые данные таблицы.

Текущий SQL Таблица сервера Src_Tbl:

ID                                      Name    Value
--------------------------------------------------------------------------
9C8AA305-5977-4803-8C5F-E0E8665B9069    author  Raghav Mishra
9C8AA305-5977-4803-8C5F-E0E8665B9069    title   The First Article to SSC
9C8AA305-5977-4803-8C5F-E0E8665B9069    genre   Fiction
9C8AA305-5977-4803-8C5F-E0E8665B9069    price   200
9C8AA305-5977-4803-8C5F-E0E8665B9069    pub_date    1/31/2013
9C8AA305-5977-4803-8C5F-E0E8665B9069    review  Interesting book
9C8AA305-5977-4803-8C5F-E0E8665B9069    author  Vasanth Mishra
9C8AA305-5977-4803-8C5F-E0E8665B9069    title   The First Article to SSC
9C8AA305-5977-4803-8C5F-E0E8665B9069    genre   Fiction
9C8AA305-5977-4803-8C5F-E0E8665B9069    price   90
9C8AA305-5977-4803-8C5F-E0E8665B9069    pub_date    1/29/2013
9C8AA305-5977-4803-8C5F-E0E8665B9069    review  fiction book
9C8AA305-5977-4803-8C5F-E0E8665B9069    author  Vinoth Mishra
9C8AA305-5977-4803-8C5F-E0E8665B9069    title   The First Article to SSC
9C8AA305-5977-4803-8C5F-E0E8665B9069    genre   Fiction
9C8AA305-5977-4803-8C5F-E0E8665B9069    price   150
9C8AA305-5977-4803-8C5F-E0E8665B9069    pub_date    1/30/2013
9C8AA305-5977-4803-8C5F-E0E8665B9069    review  Good book

После транспонирования это должно выглядеть следующим образом:

ID                                      author          title                       genre     price     pub_date    review
-------------------------------------------------------------------------------------------------------------------------------------
9C8AA305-5977-4803-8C5F-E0E8665B9069    Raghav Mishra   The First Article to SSC    Fiction     200     1/31/2013   Interesting book
9C8AA305-5977-4803-8C5F-E0E8665B9069    Vasanth Mishra  The First Article to SSC    Fiction      90     1/29/2013   fiction book
9C8AA305-5977-4803-8C5F-E0E8665B9069    Vinoth Mishra   The First Article to SSC    Fiction     150     1/30/2013   Good book

Я пробовал этот запрос

SELECT *
FROM
    (SELECT Name, Value
     FROM dbo.Src_Tbl) AS Src 
PIVOT
    (MAX(Value) FOR Name IN (author, title, genre, price, pub_date, review)) AS PivotTable;

Поскольку функция Pivot() требует использования функции агрегирования, она ограничивает строки (данные теряются).

Я получаю только один запись которая мне не нужна. Мне нужна прямая транспонирование.

Даже если я попытаюсь использовать некоторые операторы case с группой по одной и той же проблеме, придется агрегировать. Это формулировка проблемы и является требованием клиента из набора данных [простая транспонирование).

Есть ли способ сделать это на сервере SSIS / T- SQL / SQL?

Мне нужен вывод результата из Src_Tbl.

Мне нужно использовать SQL Сервер для этого, процедуру T- SQL или SSIS.

Кстати, я действительно удивляюсь, почему нет возможности сделать прямую транспонирование, например, как мы копируем вставку в Excel.

1 Ответ

0 голосов
/ 19 января 2020

Вы можете попытаться воспроизвести порядок с вымышленным row_number и после этого идентифицировать группы, добавив новый столбец с row_number (). Из c это не то, как вы должны хранить свои данные (попробуйте использовать первичные ключи, обеспечивая правильный порядок для ваших данных), но я надеюсь, это поможет:

WITH Src_Tbl AS (
    SELECT
         t.ID
        ,t.Name
        ,t.Value
    FROM (VALUES
        ('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'author', 'Raghav Mishra')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'title', 'The First Article to SSC')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'genre', 'Fiction')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'price', '200')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'pub_date', '1/31/2013')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'review', 'Interesting book')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'author', 'Vasanth Mishra')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'title', 'The First Article to SSC')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'genre', 'Fiction')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'price', '90')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'pub_date', '1/29/2013')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'review', 'fiction book')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'author', 'Vinoth Mishra')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'title', 'The First Article to SSC')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'genre', 'Fiction')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'price', '150')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'pub_date', '1/30/2013')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'review', 'Good book')

    ) t (ID, Name, Value)
)
SELECT
*
FROM (
    SELECT
         t.ID
        ,t.Name
        ,t.Value
        ,ROW_NUMBER() OVER (PARTITION BY Id, Name ORDER BY t.RN_for_correct_order) AS RN
    FROM (
        SELECT
             t.ID
            ,t.Name
            ,t.Value
            ,ROW_NUMBER() OVER (ORDER BY ISNULL(1, 1)) AS RN_for_correct_order -- try to get same order as in example
        FROM Src_Tbl t
    ) t
) t
PIVOT
    (MAX(Value) FOR Name IN (author, title, genre, price, pub_date, review)) AS PivotTable;
...