Pivot или Unpivot небольшой стол - PullRequest
2 голосов
/ 12 марта 2020

Я с трудом нахожу голову вокруг точки разворота / разворота - все примеры, которые я нахожу в Интернете, я считаю более сложными, чем мне нужно.

Представьте себе таблицу в таком виде:

CREATE TABLE Custom (ID tinyint identity, value nvarchar(20))
INSERT INTO Custom VALUES ('red')
INSERT INTO Custom VALUES ('green')
INSERT INTO Custom VALUES ('blue')

Таблица отображается как

ID    VALUE
1     red
2     green
3     blue

Я хочу, чтобы таблица отображалась как

COLOR1    COLOR2    COLOR3
red       green     blue

Возможно ли это с UNPIVOT?

Спасибо!

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Вот один способ получения желаемых результатов с условным агрегированием:

select 
    max(case when id = 1 then value end) color1,
    max(case when id = 2 then value end) color2,
    max(case when id = 3 then value end) color3
from custom

Если у вас нет последовательного id, начинающегося с 1, вы можете эмулировать его с помощью row_number() :

select
    max(case when rn = 1 then value end) color1,
    max(case when rn = 2 then value end) color2,
    max(case when rn = 3 then value end) color3
from (select value, row_number() over(order by id) rn from mytable)
0 голосов
/ 12 марта 2020

Это невозможно с UNPIVOT, вы захотите использовать PIVOT. Документация Microsoft по теме «Использование PIVOT и UNPIVOT»

Но вот пример использования ваших тестовых данных с комментариями:

DECLARE @Custom TABLE
    (
        [ID] TINYINT IDENTITY
      , [value] NVARCHAR(20)
    );
INSERT INTO @Custom
VALUES ( 'red' )
     , ( 'green' )
     , ( 'blue' );

SELECT *
FROM   @Custom
    PIVOT (
              MAX([value])  --column being aggregated, the column values you want horizontal
              FOR [ID] IN ( [1], [2], [3] ) --The column that contains the value that will become the column headers.
          ) AS [pvt];

Предоставление использования результатов

1                    2                    3
-------------------- -------------------- --------------------
red                  green                blue

Поскольку в заголовках столбцов вы хотите использовать словосочетание «COLOR», мы сопоставим его в подзапросе со столбцом ID и настроим стержень

SELECT *
FROM   (
           --Since you want 'COLOR' as part of the column name we do a sub-query and concat that verbiage with the ID
           SELECT CONCAT('COLOR', [ID]) AS [ColumnColor]
                , [value]
           FROM   @Custom
       ) AS [Cst]
PIVOT (
          MAX([value])  --Same as before, column being aggregated, the column values you want horizontal
          FOR [ColumnColor] IN ( [COLOR1], [COLOR2], [COLOR3] ) --This changes now to reflect the concatenated column and the new column header values
      ) AS [pvt];

. результаты

COLOR1               COLOR2               COLOR3
-------------------- -------------------- --------------------
red                  green                blue
...