Получить значение родительской записи в запросе мощности

#excel #powerquery

Вопрос:

Я загружаю данные с сервера Team Foundation Server, которые выходят в родительском дочернем формате.

ID Тип рабочего элемента Оставшиеся Часы История родителей Оставшиеся Часы (Agg)
200 История 200 8
568 Задача 2 200
827 Задача 6 200

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

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

Предположим, что записи не будут отсортированы и останутся в родительском дочернем формате. В каждой истории может быть несколько задач. Я хочу сделать это в power query в excel.

Пожалуйста, посоветуйте.

Ответ №1:

В powerquery,

Добавьте пользовательский столбец с именем Родительская история с формулой

 = if [Work Item Type]="Story" then [ID] else null
 

Щелкните правой кнопкой мыши этот новый столбец и заполните его

Группа по родительской истории и сумма оставшихся часов. Добавьте пользовательский столбец с именем Тип рабочего элемента с формулой = «История».

Объедините эту таблицу с результатами до создания группы, используя Внешнее соединение слева, сопоставив поля Типа рабочего элемента и Родительской истории между таблицами. То, как я реализовал это, потребовало изменений кода вручную в разделе » Главная…дополнительно…».

Увеличьте количество часов

Пример кода, который предполагает, что ваши исходные данные из 3 столбцов находятся в таблице диапазонов1. Вы можете вставить код в PowerQuery в домашних условиях…Расширенный редактор…

 let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Work Item Type", type text}, {"Remaining Hours", Int64.Type}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Parent Story", each if [Work Item Type]="Story" then [ID] else null),
#"Filled Down" = Table.FillDown(#"Added Custom",{"Parent Story"}),

// group the data to sum hours
#"Grouped Rows" = Table.Group(#"Filled Down", {"Parent Story"}, {{"TotalHours", each List.Sum([Remaining Hours]), type number}}),
#"Added Custom1" = Table.AddColumn(#"Grouped Rows", "Work Item Type", each "Story"),

// merge the data back in
#"Merged Queries" = Table.NestedJoin(#"Filled Down",{"Work Item Type", "Parent Story"},#"Added Custom1",{"Work Item Type", "Parent Story"},"Table3",JoinKind.LeftOuter),
#"Expanded Table3" = Table.ExpandTableColumn(#"Merged Queries", "Table3", {"TotalHours"}, {"Remaining Hours (Agg)"})
in #"Expanded Table3"
 

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

Альтернативный код, использующий пользовательскую функцию вместо слияния.

 let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"Work Item Type", type text}, {"Remaining Hours", Int64.Type}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Parent Story", each if [Work Item Type]="Story" then [ID] else null),
#"Filled Down" = Table.FillDown(#"Added Custom",{"Parent Story"}),
countem = (i)=>List.Sum(Table.SelectRows(#"Filled Down" , each [Parent Story]=i) [Remaining Hours]),
#"Added Custom1" = Table.AddColumn(#"Filled Down", "Remaining Hours (Agg)", each if [Work Item Type] = "Task" then null else countem([Parent Story] ))
in #"Added Custom1"