Как перенести данные из широкоформатного формата в длинный в Excel или SQL? - PullRequest
0 голосов
/ 07 мая 2018

У меня есть данные, как показано ниже. Любая идея, как преобразовать широкоформатный формат в длинный в Excel или SQL.

ID       TOTAL    SCORE   PLAYER
34543    12342     456    45
45632    34521     241    33

ВЫХОД:

ID        DATA_TYPE   VALUE
34543      TOTAL      12342
34543      SCORE      34521
34543      PLAYER     45
45632      TOTAL      34521
45632      SCORE      241
45632      PLAYER      33

Ответы [ 4 ]

0 голосов
/ 07 мая 2018

Если ваша версия Excel - 2010 или более поздняя, ​​вы можете использовать Power Query (также известный как Get & Transform в Excel 2016) и отключить все, кроме столбца ID.

Легко делается из графического интерфейса

или

Код

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"TOTAL", Int64.Type}, {"SCORE", Int64.Type}, {"PLAYER", Int64.Type}}),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"ID"}, "Attribute", "Value")
in
    #"Unpivoted Other Columns"
0 голосов
/ 07 мая 2018

Вам нужно использовать UNPIVOT в вашем запросе. Попробуйте это:

--sample data
declare @t table (id int, total int, score int, player int)
insert into @t values
(34543, 12342, 456, 45),
(45632, 34521, 241, 33)
--query that will return deisred result
select Id, Data_Type, Value from (
    select * from @t
) [t] unpivot (
    VALUE for DATA_TYPE in (total, score, player)
) [u]
0 голосов
/ 07 мая 2018

Мой предпочтительный метод для отмены поворота - использовать apply:

select t.id, v.*
from t cross apply
     (values ('TOTAL', total), ('SCORE', score), ('PLAYER', player)
     ) v(DATA_TYPE, VALUE);

В дополнение к тому, что это довольно лаконично, это хорошее введение в боковые соединения.Это очень мощная конструкция в SQL, полезная для многих других целей (в отличие от UNPIVOT).Он также сканирует таблицу только один раз, поэтому он более эффективен, чем UNION ALL.

0 голосов
/ 07 мая 2018

Используйте этот запрос:

SELECT *
FROM
    (SELECT distinct ID, 'TOTAL' AS DATA_TYPE, TOTAL AS VALUE
    FROM Your_Table
    UNION
    SELECT distinct ID, 'SCORE' AS DATA_TYPE, SCORE AS VALUE
    FROM Your_Table
    UNION
    SELECT distinct ID, 'PLAYER' AS DATA_TYPE, PLAYER AS VALUE
    FROM Your_Table) as tbl
ORDER BY ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...