Конвертировать строки в столбцы в PowerQuery. Методы Transpose & Pivot не дают правильных результатов - PullRequest
0 голосов
/ 04 октября 2019

У меня есть таблица PowerQuery под названием «В ожидании» в Excel, как показано ниже:

| Action User | Index |
|-------------|-------|
| Employee A  | 1     |
| Employee B  | 1     |
| Employee B  | 1     |
| Employee B  | 1     |
| Employee C  | 1     |
| Employee C  | 1     |
| Employee C  | 1     |
| Employee C  | 1     |
| Employee C  | 1     |
| Employee D  | 1     |
| Employee D  | 1     |
| Employee D  | 1     |

Я хочу преобразовать ее так, чтобы она выглядела так (у нее будут заголовки столбцов, ноЯ не беспокоюсь о том, что они есть:

| Employee A | 1 |   |   |   |   |
| Employee B | 1 | 1 | 1 |   |   |
| Employee C | 1 | 1 | 1 | 1 | 1 |
| Employee D | 1 | 1 | 1 |   |   |  

У меня есть отдельная таблица ( TeamMembers ), в которой перечислены уникальные имена сотрудников, к которым я пытался присоединиться, чтобы создать этосписок, но в конце концов получим версии, похожие на исходную таблицу.

Я мог бы сделать это с VBA или серией формул Transpose вне Powerquery, но чувствую, что это не лучший способ - формулу нужно обновитькаждую неделю учитывать разное количество рядов.

Любая помощь будет принята с благодарностью.


Базовая транспонирование не работает, так как заканчивается так:

| Column1    | Column2    | Column3    | Column4    | Column5    | Column6    |
|------------|------------|------------|------------|------------|------------|
| Employee A | Employee B | Employee B | Employee B | Employee C | Employee C |
| 1          | 1          | 1          | 1          | 1          | 1          |

Поворот заканчивается следующим образомэто:

| Employee A | Employee B | Employee C | Employee D |
|------------|------------|------------|------------|
| 1          | 3          | 5          | 3          |  

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Общая хитрость заключается в том, чтобы добавить в таблицу новый столбец с совокупным счетом пользователя действия:

Выбрать столбец пользователя действия. Группировать по ... [x] Basic, Группировать по: Action User, Новый столбец Имя: Count, Operation: Count Rows [ok]

и изменять полученный код с

= Table.Group(Source, {"Action User"}, {{"Count", each Table.RowCount(_), type number}})

на

= Table.Group(Source, {"Action User"}, {{"Count", each Table.AddIndexColumn(_, "Cum",1,1), type table}})

Разверните Index и Cum, щелкнув стрелки рядом с заголовком столбца Count

Выберите столбец Cum, столбец Pivot .., используя Index в качестве столбца значений [x] дополнительные параметры, не делайте 'т совокупный

Полный код ниже

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Grouped Rows" = Table.Group(Source, {"Action User"}, {{"Count", each Table.AddIndexColumn(_, "Cum",1,1), type table}}),
#"Expanded Count" = Table.ExpandTableColumn(#"Grouped Rows", "Count", {"Index", "Cum"}, {"Index", "Cum"}),
#"Pivoted Column1" = Table.Pivot(Table.TransformColumnTypes(#"Expanded Count", {{"Cum", type text}}, "en-US"), List.Distinct(Table.TransformColumnTypes(#"Expanded Count", {{"Cum", type text}}, "en-US")[Cum]), "Cum", "Index")
in #"Pivoted Column1"
0 голосов
/ 04 октября 2019

Еще один способ сделать это - сгруппировать и изменить функцию агрегирования. Объединять вместо суммы / максимума / среднего. Затем вы можете разделить по разделителю, который вы используете в своей функции сцепления Text.Combine.

Когда вы делаете Группировку по, шаг обычно выглядит следующим образом:

= Table.Group(Source, {"ActionUser"}, {{"Sum", each List.Sum([Index]), type number}})

Что я имеюdone - заменить List.Sum([Index]) на следующее:

Text.Combine(List.Transform([Index], Text.From), ",")

Преобразует числа в текст, а затем объединяет их с Text.Combine, используя запятую в качестве разделителя для получения таблицы, подобной этой:

Group By Concatenated

Отсюда Transform> Split Column> By Delimiter завершит работу.


Полный код M:

let
    Source = Table1,
    #"Grouped Rows" = Table.Group(Source, {"ActionUser"}, {{"Concat", each Text.Combine(List.Transform([Index], Text.From), ","), type text}}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Grouped Rows", "Concat", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), {"Concat.1", "Concat.2", "Concat.3", "Concat.4", "Concat.5"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Concat.1", Int64.Type}, {"Concat.2", Int64.Type}, {"Concat.3", Int64.Type}, {"Concat.4", Int64.Type}, {"Concat.5", Int64.Type}})
in
    #"Changed Type"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...