Страницы: 1
RSS
Power Query: cвернуть/развернуть столбец
 
Добрый день.

Возник вопрос касательно переструктурирования таблицы при помощи Power Query.
Нужно свернуть строки в столбцы по повторяющимся значениям, или сделать это каким-то другим рациональным способом. Пример прикрепляю.

Заранне спасибо за помощь.
 
как то так
Код
let
    a = Table.AddColumn(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content], "Сведено", each Text.Combine({Text.From([Респондент], "ru-RU"), [Пол], Text.From([Возраст], "ru-RU")}, ","), type text),
    b = Table.SplitColumn(Table.Group(a, {"ДХ"}, {{"как надо", each Text.Combine(List.Transform(_[Сведено], Text.From), ",")}}), "как надо", Splitter.SplitTextByDelimiter(",",0), 25),
    c = Table.Transpose(Table.SelectRows(Table.Transpose(b), each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null}))))
in
    c
Изменено: artyrH - 27.03.2019 14:23:14
 
Ещё вариант:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    group = Table.Group(Source, {"ДХ"}, {{"temp", each Table.AddIndexColumn(_, "i", 1, 1)}}),
    expand = Table.ExpandTableColumn(group, "temp", {"Респондент", "Пол", "Возраст", "i"}),
    unpivot = Table.UnpivotOtherColumns(expand, {"ДХ", "i"}, "Атрибут", "Значение"),
    merge = Table.CombineColumns(Table.TransformColumnTypes(unpivot, {{"i", type text}}, "ru-RU"),{"Атрибут", "i"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"key"),
    pivot = Table.Pivot(merge, List.Distinct(merge[key]), "key", "Значение")
in
    pivot
 
Эх, давно хотелось с рекурсией по извращаться, а тут такая удача!
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    ОбъединенныеСтолбцы = Table.CombineColumns(Table.TransformColumnTypes(Источник, {{"Респондент", type text}, {"Возраст", type text}}, "ru-RU"),{"Респондент", "Пол", "Возраст"},Combiner.CombineTextByDelimiter(";", QuoteStyle.None),"Сведено"),
    СгруппированныеCтроки = Table.Group(ОбъединенныеСтолбцы, {"ДХ"}, {{"Таб", each Table.Transpose( Table.RemoveColumns( _, {"ДХ"}) ), type table}}),
    РазворачиваемСтолбцы = Table.ExpandTableColumn(СгруппированныеCтроки, "Таб", List.Union( List.Transform( СгруппированныеCтроки[Таб], (x) => Table.ColumnNames(x) ) ) ),
    Имена = List.Buffer( Table.ColumnNames( Table.RemoveColumns( Источник, {"ДХ"}) ) ),
    РазделяемСтолбцы = (t,i) =>
        if Table.HasColumns( t, "Column" & Text.From(i) ) 
            then @РазделяемСтолбцы( Table.SplitColumn( t, "Column" & Text.From(i), Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), List.Transform( Имена, each _ & "." & Text.From(i) ) ), i + 1)
            else t,
    Результат = РазделяемСтолбцы( РазворачиваемСтолбцы, 1 )
in
    Результат
Вот горшок пустой, он предмет простой...
 
Спасибо большое всем!
Получилось!
Страницы: 1
Наверх