Как отформатировать таблицу Excel, содержащую двойные заголовки, в Power Query

У меня есть таблица следующего формата:

NB. Следующий пример представляет собой сокращенную версию таблицы, в которой в качестве примера представлена ​​только одна категория. В реальной таблице названия категорий перечислены в верхней строке, а месяцы года (с января 2021 г. по декабрь 2022 г.) — в строке ниже. Каждая последующая строка или столбец показывает значения за каждый месяц. В первой таблице ниже столбцы A, B и C представляют собой необходимую дополнительную информацию. Однако все, начиная со столбца D, представляет собой раздел таблицы с двойными заголовками и категориальной информацией.

Колонка А Колонка Б Колонка С Колонка D Колонка Е ... Колонка N Кол1 Кол2 Кол3 Категория 1 Кол4 ... столбец N Имя родителя/ребенка ИДЕНТИФИКАТОР Родитель/ребенок янв 2021 г. февраль 2021 г. ... декабрь 2022 г. Джейсон 1 Родитель 1000 2000 г. ... 1500 Тимми 2 Ребенок 600 1000 ... 600 Сара 3 Ребенок 400 1000 ... 900

Я пытаюсь сделать некоторые преобразования для достижения следующего результата:

Имя родителя/ребенка ИДЕНТИФИКАТОР Категория Родитель/ребенок Год Месяц Ценить Джейсон 1 Категория 1 Родитель 2021 Ян 1000 Тимми 2 Категория 1 Ребенок 2021 Ян 600 Сара 3 Категория 1 Ребенок 2021 Ян 400 Джейсон 1 Категория 1 Родитель 2021 февраль 2000 г. Тимми 2 Категория 1 Ребенок 2021 февраль 1000 Сара 3 Категория 1 Ребенок 2021 февраль 1000 ... ... ... ... ... ... ... Лицо N ID N Категория N Родитель/Ребенок N Год N Месяц N Значение N

Я пытался с помощью поворота, транспонирования и т. д., но я не смог достичь желаемого результата. Я новичок в использовании кода power query/M, но я не могу найти что-то подходящее, чтобы помочь мне достичь желаемого результата.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
94
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это должно делать то, что вы хотите. «Хитрость» заключается в том, чтобы развернуть столбцы «Дата».

Примечание. Поскольку вы показываете только одну категорию, было неясно, как она будет распространяться, поэтому я проигнорировал ее. Вам нужно будет изменить код, чтобы лучше учитывать изменения. Я подозреваю, что вам нужно будет сделать Table.Group для каждой категории, а затем вывести категорию в виде одного столбца в дополнение к приведенному ниже коду.

let

//change next line to reflect actual data source
    Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],

//Remove top row and promote next row to headers
    #"Removed Top Rows" = Table.Skip(Source,1),
    #"Promoted Headers" = Table.PromoteHeaders(#"Removed Top Rows", [PromoteAllScalars=true]),

//Unpivot the "Date" columns
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Promoted Headers", 
        {"Parent/ Child Name", "ID", "Parent/ Child"}, "Attribute", "Value"),

//Set data type of Date columns to datetime
    #"Changed Type" = Table.TransformColumnTypes(#"Unpivoted Other Columns",{{"Attribute", type datetime}}),

//Sort ascending by Date and then by ID
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"Attribute", Order.Ascending}, {"ID", Order.Ascending}}),

//Add Custom column for Year and Month
    #"Added Custom" = Table.AddColumn(#"Sorted Rows", "Year", each Date.Year([Attribute]), Int64.Type),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "Month", each DateTime.ToText([Attribute], "MMM"), type text),

//Remove unneeded columns and set desired order of remaining columns
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"Attribute"}),
    #"Reordered Columns"= Table.ReorderColumns(#"Removed Columns",
        {"Parent/ Child Name", "ID", "Parent/ Child", "Year", "Month", "Value"}),

//Set all data types
    #"Set Types" = Table.TransformColumnTypes(#"Reordered Columns",
        List.Zip({Table.ColumnNames(#"Reordered Columns"), {type text, Int64.Type, type text, Int64.Type, type text, Int64.Type}}))
        
in
    #"Set Types"

Спасибо, я попробую это. Когда вы говорите развернуть столбцы даты, вы имеете в виду выбрать все столбцы, у которых есть дата, а затем сказать развернуть другие столбцы? Некоторая ясность по категориям. Существует несколько категорий, и каждая категория имеет значения для каждого месяца года на 2021 и 2022 годы.

Sashil Paruk 16.04.2023 13:35

@SahilParuk Ваше описание категории недостаточно конкретно, чтобы я мог действовать. И ваш пример включает только одну категорию. Если вы не можете понять, как с этим бороться, я предлагаю вам отредактировать свой вопрос, чтобы предоставить более реалистичный пример. Что касается вашего основного вопроса, это противоположно тому, что вы пишете.

Ron Rosenfeld 16.04.2023 14:48

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

Sashil Paruk 19.04.2023 15:06

@SahilParuk Я полагаю, вы имеете в виду, что в вашем примере, где у вас есть ячейки, содержащие Col4 и ColN, это должны быть категории. Если это так, мы можем просто извлечь список категорий и добавить его в виде столбца. Но поскольку вы уже приняли ответ, я не буду сейчас беспокоиться.

Ron Rosenfeld 20.04.2023 02:14
Ответ принят как подходящий

Настоящим я отправляю вам M-коды, которые включают столбец [категория].

//изменить источник данных с заменой в первом исходном предложении ниже

let
    Source = Excel.Workbook(File.Contents("C:\Users\zhenger\Desktop\powerquery sample.xlsx"), null, true),
    table_Sheet = Source{[Item = "table",Kind = "Sheet"]}[Data],
    #"Transposed Table" = Table.Transpose(table_Sheet),

    #"Filled Down" = Table.FillDown(#"Transposed Table",{"Column1"}),
    #"Added Custom" = Table.AddColumn(#"Filled Down", "Custom", each "-"),
    #"Reordered Columns" = Table.ReorderColumns(#"Added Custom",{"Column1", "Custom", "Column2", "Column3", "Column4", "Column5"}),
    #"Inserted Merged Column" = Table.AddColumn(#"Reordered Columns", "Merged", each Text.Combine({[Column1], [Custom], Text.From([Column2], "zh-CN")}, ""), type text),
    #"Removed Columns" = Table.RemoveColumns(#"Inserted Merged Column",{"Column1", "Custom", "Column2"}),
    #"Reordered Columns1" = Table.ReorderColumns(#"Removed Columns",{"Merged", "Column3", "Column4", "Column5"}),
    #"Transposed Table1" = Table.Transpose(#"Reordered Columns1"),
    #"Promoted Headers" = Table.PromoteHeaders(#"Transposed Table1", [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"-Parent/ Child Name", type text}, {"-ID", Int64.Type}, {"-Parent/ Child", type text}, {"Category 1-2021/1/1", Int64.Type}, {"Category 1-2021/2/1", Int64.Type}, {"Category 1-2021/3/1", Int64.Type}, {"Category 1-2021/4/1", Int64.Type}, {"Category 1-2021/5/1", Int64.Type}, {"Category 1-2021/6/1", Int64.Type}, {"Category 1-2021/7/1", Int64.Type}, {"Category 1-2021/8/1", Int64.Type}, {"Category 1-2021/9/1", Int64.Type}, {"Category 1-2021/10/1", Int64.Type}, {"Category 1-2021/11/1", Int64.Type}, {"Category 1-2021/12/1", Int64.Type}, {"Category 1-2022/1/1", Int64.Type}, {"Category 1-2022/2/1", Int64.Type}, {"Category 1-2022/3/1", Int64.Type}, {"Category 1-2022/4/1", Int64.Type}, {"Category 1-2022/5/1", Int64.Type}, {"Category 1-2022/6/1", Int64.Type}, {"Category 1-2022/7/1", Int64.Type}, {"Category 1-2022/8/1", Int64.Type}, {"Category 1-2022/9/1", Int64.Type}, {"Category 1-2022/10/1", Int64.Type}, {"Category 1-2022/11/1", Int64.Type}, {"Category 1-2022/12/1", Int64.Type}, {"Category 2-2021/1/1", Int64.Type}, {"Category 2-2021/2/1", Int64.Type}, {"Category 2-2021/3/1", Int64.Type}, {"Category 2-2021/4/1", Int64.Type}, {"Category 2-2021/5/1", Int64.Type}, {"Category 2-2021/6/1", Int64.Type}, {"Category 2-2021/7/1", Int64.Type}, {"Category 2-2021/8/1", Int64.Type}, {"Category 2-2021/9/1", Int64.Type}, {"Category 2-2021/10/1", Int64.Type}, {"Category 2-2021/11/1", Int64.Type}, {"Category 2-2021/12/1", Int64.Type}, {"Category 2-2022/1/1", Int64.Type}, {"Category 2-2022/2/1", Int64.Type}, {"Category 2-2022/3/1", Int64.Type}, {"Category 2-2022/4/1", Int64.Type}, {"Category 2-2022/5/1", Int64.Type}, {"Category 2-2022/6/1", Int64.Type}, {"Category 2-2022/7/1", Int64.Type}, {"Category 2-2022/8/1", Int64.Type}, {"Category 2-2022/9/1", Int64.Type}, {"Category 2-2022/10/1", Int64.Type}, {"Category 2-2022/11/1", Int64.Type}, {"Category 2-2022/12/1", Int64.Type}}),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"-Parent/ Child Name", "-ID", "-Parent/ Child"}, "Attribute", "Value"),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Unpivoted Other Columns", "Attribute", Splitter.SplitTextByEachDelimiter({"-"}, QuoteStyle.Csv, false), {"Attribute.1", "Attribute.2"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Attribute.1", type text}, {"Attribute.2", type date}}),
    #"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"Attribute.1", "Category"}, {"Attribute.2", "date"}}),
    #"Inserted Year" = Table.AddColumn(#"Renamed Columns", "Year", each Date.Year([date]), Int64.Type),
    #"Inserted Month" = Table.AddColumn(#"Inserted Year", "Month", each Date.Month([date]), Int64.Type),
    #"Reordered Columns2" = Table.ReorderColumns(#"Inserted Month",{"-Parent/ Child Name", "-ID", "-Parent/ Child", "Category", "date", "Year", "Month", "Value"})
in
    #"Reordered Columns2"

Другие вопросы по теме