Изменение структуры таблицы в зависимости от одного столбца в PowerQuery

#excel #pivot #powerquery #transformation #divide

Вопрос:

В последнее время я борюсь с преобразованием таблицы с помощью запроса питания. Я пробовал разные советы из Интернета, и я был близок к этому благодаря повороту, но из-за недостатка знаний, связанных с инструментом PowerQuery, мне пришлось отказаться. Итак, у меня есть таблица, в которой в первом столбце указывается запланированная дата для данной операции и фактическая дата. Это выглядит так:

Структура текущей таблицы
Структура текущей таблицы

Я хотел бы изменить структуру таблицы, чтобы удалить первую таблицу и добавить в заголовок «План операции 1», «Фактическая операция 1» и так далее. Поэтому мое желание состоит в том, чтобы выполнить следующую ситуацию:

Структура желаемой таблицы
Структура желаемой таблицы

Я пробовал разные вещи, но все равно не смог этого сделать. Я надеюсь, что кто-нибудь даст мне несколько советов о том, как это сделать. Я был бы очень признателен за любое предложение.

Ответ №1:

Часто с такого рода проблемами вам приходится отключать и группировать, прежде чем получать желаемые результаты сводки.

Код M

 let
    Source = Excel.CurrentWorkbook(){[Name="Table6"]}[Content],

    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Source, {"Type of Date", "Project"}, "Attribute", "Value"),

//create the New column headers by merging
    #"Inserted Merged Column" = Table.AddColumn(#"Unpivoted Other Columns", "Op Type", each Text.Combine({[Attribute], [Type of Date]}, " "), type text),
    #"Removed Columns" = Table.RemoveColumns(#"Inserted Merged Column",{"Type of Date", "Attribute"}),

//Group by "Project" and Pivot each grouped table
    #"Grouped Rows" = Table.Group(#"Removed Columns", {"Project"}, {
        {"Pivot", each Table.Pivot(_, List.Distinct(_[#"Op Type"]), "Op Type", "Value")}
        }),

//remove unneeded columns and expand the Pivoted column
    #"Removed Columns1" = Table.RemoveColumns(#"Grouped Rows",{"Project"}),
    #"Expanded Pivot" = Table.ExpandTableColumn(#"Removed Columns1", "Pivot", 
        {"Project", "Operation 1 Planned", "Operation 2 Planned", "Operation 3 Planned", "Operation 4 Planned", "Operation 1 Actual", "Operation 2 Actual", "Operation 3 Actual", "Operation 4 Actual"}, {"Project", "Operation 1 Planned", "Operation 2 Planned", "Operation 3 Planned", "Operation 4 Planned", "Operation 1 Actual", "Operation 2 Actual", "Operation 3 Actual", "Operation 4 Actual"}),

    //type the date columns
    dateCols = List.RemoveFirstN(Table.ColumnNames(#"Expanded Pivot"),1),
    dateTypes = List.Zip({dateCols,List.Repeat({type date}, List.Count(dateCols))}),
    typed = Table.TransformColumnTypes(#"Expanded Pivot",dateTypes)
in
    typed
 

Данные
введите описание изображения здесь

Результаты
введите описание изображения здесь

ПРАВКА Я отметил, что порядок имен столбцов в таблице результатов был не таким, как вы показали в своем примере. Я добавил несколько строк в код, чтобы порядок был правильным.

Попробуйте вместо этого этот код:

 let
    Source = Excel.CurrentWorkbook(){[Name="Table6"]}[Content],

    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Source, {"Type of Date", "Project"}, "Attribute", "Value"),

//create the New column headers by merging
    #"Inserted Merged Column" = Table.AddColumn(#"Unpivoted Other Columns", "Op Type", each Text.Combine({[Attribute], [Type of Date]}, " "), type text),
    #"Removed Columns" = Table.RemoveColumns(#"Inserted Merged Column",{"Type of Date", "Attribute"}),
    //Group by "Project" and Pivot each grouped table

//create list of the Pivot Column Names in the desired order
//Extract a unique list of the names, then sort them => {op1Act, op1Plan, op2Act, op2Plan, ...}
//Split the list (List.Alternate) taking every other 
//    starting with either the first or second entry => {op1Act,op2Act,...}, and {op1Plan,op2Plan...}
//Zip those two lists together with the second list first; then Combine them into a single list
pivotColNames = List.Combine(
                    List.Zip({
                        List.Alternate(List.Sort(List.Distinct(#"Removed Columns"[Op Type])),1,1),
                        List.Alternate(List.Sort(List.Distinct(#"Removed Columns"[Op Type])),1,1,1)
                            })),

    #"Grouped Rows" = Table.Group(#"Removed Columns", {"Project"}, {
        {"Pivot", each Table.Pivot(_, pivotColNames, "Op Type", "Value")}
        }),

//remove unneeded columns and expand the Pivoted column
    #"Removed Columns1" = Table.RemoveColumns(#"Grouped Rows",{"Project"}),

//create column name list for the expanded pivot table, in the desired order
x = List.Combine({{"Project"},pivotColNames}),
    #"Expanded Pivot" = Table.ExpandTableColumn(#"Removed Columns1", "Pivot", 
        x,x),

    //type the date columns
    dateCols = List.RemoveFirstN(Table.ColumnNames(#"Expanded Pivot"),1),
    dateTypes = List.Zip({dateCols,List.Repeat({type date}, List.Count(dateCols))}),
    typed = Table.TransformColumnTypes(#"Expanded Pivot",dateTypes)
in
    typed
 

Результаты с новым кодом
введите описание изображения здесь

Комментарии:

1. Это именно то, чего я хотел! Большое спасибо. У меня есть еще одна просьба. Не могли бы вы дать мне подсказку, где я могу получить знания о том, как осуществить эту трансформацию? Мне нужно преобразовать еще одну таблицу, поэтому я пытаюсь следовать вашим шагам. Каким — то образом я борюсь. Поэтому я хотел бы в будущем обладать знаниями для себя об этих фундаментальных преобразованиях 🙂

2. @miasekk Я обнаружил, что документация MS ограничена. Я читал различные блоги, праймеры и т. Д. В Интернете, А также ответы других людей с обратной обработкой. Я думаю, что вы многое выиграете, работая с некоторыми онлайн-ресурсами, но я недостаточно знаком, чтобы рекомендовать что-то большее, чем общий поиск; и я не думаю, что какой-либо отдельный ресурс даст вам все, что вам нужно. Мой основной метод обучения-это решение других проблем, но это медленный метод.

3. @miasekk Я отметил, что порядок столбцов в таблице результатов был не таким, как вы показали в своем примере. Я добавил несколько строк в код, чтобы порядок был правильным.

4. Спасибо вам за дополнительную заботу. Я сделал это вручную ранее, но это не было проблемой, в то время как мой главный вопрос был для меня огромной проблемой, поэтому я действительно ценю ваш ответ, спасибо!