Страницы: 1
RSS
Преобразовать длинную таблицу в широкую через Power Query, Проблема преобразования
 
Доброго дня суток, уважаемые эксперты Excel!

есть проблема, мною никак не разрешимая:

Имеется таблица с огромным кол-вом строк (в приложении таблица 1), где
первый столбец - номер участника (один и тот же номер участника может встречаться от 1 до 4х раз)
второй столбец - номер решения - номер решения всегда уникальный
третий столбец - дата решения
четвертый столбец этап соревнования (всего 4 этапа)
пятый столбец - результат этапа соревнования.

Данную таблицу необходимо преобразовать в таблицу 2, где
первый столбец - номер участника - всегда уникальный
со второго по четвертый, соответственно № решения этапа 1, Дата этапа 1, результат этапа 1
со пятого по седьмой, соответственно № решения этапа 2, Дата этапа 2, результат этапа 2
и тд до 4 этапа.

еще одно условие - таблица 1 постоянно дополняется, поэтому необходима автоматическая связь с Таблицей 2 через  Power Query.

Прошу помочь, сам не в силах найти решения!

Огромное спасибо!
 
Александр Орехов, обратите внимание, что у Вас для некоторых участников есть по 2 строки на один этап (к примеру, 328-уч22).
Код
let
  data = Excel.CurrentWorkbook(){[ Name = "data" ]}[Content],
  typed = Table.TransformColumnTypes ( data, { { "Дата решения", type date } } ),
  lower = Table.TransformColumns ( typed, { { "Тип", Text.Lower, type text } } ),
  unpivot = Table.UnpivotOtherColumns ( lower, { "№ участника", "Тип" }, "Атрибут", "Значение" ),
  combine = Table.CombineColumns ( unpivot, { "Атрибут", "Тип" }, Combiner.CombineTextByDelimiter ( " ", QuoteStyle.None ), "Column name" ),
  clmnsOrder = { "№ решения", "Дата решения", "Результат" },
  newClmns = List.Sort (
    List.Distinct ( combine[Column name] ),
    ( x ) =>
      Number.From ( Text.AfterDelimiter ( x, " ", { 0, RelativePosition.FromEnd } ) )
        + List.PositionOf ( clmnsOrder, Text.BeforeDelimiter ( x, " этап" ) ) / 100
  ),
  pivot = Table.Pivot ( combine, newClmns, "Column name", "Значение", ( lst ) => Text.Combine ( List.Transform ( lst, Text.From ), "#(lf)" ) )
in
  pivott
 
Цитата
написал:
Александр Орехов, обратите внимание, что у Вас для некоторых участников есть по 2 строки на один этап (к примеру, 328-уч22).
Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16      let        data = Excel.CurrentWorkbook(){[ Name =   "data"   ]}[Content],        typed = Table.TransformColumnTypes ( data, { {   "Дата решения"  , type date } } ),        lower = Table.TransformColumns ( typed, { {   "Тип"  , Text.Lower, type text } } ),        unpivot = Table.UnpivotOtherColumns ( lower, {   "№ участника"  ,   "Тип"   },   "Атрибут"  ,   "Значение"   ),        combine = Table.CombineColumns ( unpivot, {   "Атрибут"  ,   "Тип"   }, Combiner.CombineTextByDelimiter (   " "  , QuoteStyle.None ),   "Column name"   ),        clmnsOrder = {   "№ решения"  ,   "Дата решения"  ,   "Результат"   },        newClmns = List.Sort (          List.Distinct ( combine[Column name] ),          ( x ) =>            Number.From ( Text.AfterDelimiter ( x,   " "  , { 0, RelativePosition.FromEnd } ) )              + List.PositionOf ( clmnsOrder, Text.BeforeDelimiter ( x,   " этап"   ) ) / 100        ),        pivot = Table.Pivot ( combine, newClmns,   "Column name"  ,   "Значение"  , ( lst ) => Text.Combine ( List.Transform ( lst, Text.From ),   "#(lf)"   ) )    in        pivott   
 
Спасибо Огромное! Всё работает!

один этап это опечатки! Спасибо!
 
Александр Орехов, если опечатки и такого не должно быть, то и код можно сильно упростить :)
Страницы: 1
Наверх