Поделиться через


Агрегация значений дочерних рабочих элементов в родительский отчет-пример

Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019

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

Снимок экрана: отчет о сводной матрице функций.

Дополнительные сведения о накопительных обновлениях и параметрах отображения см. в документе "Отображение процесса свертки или итогов в Azure Boards".

Примечание.

В этой статье предполагается, что вы прочитали Обзор отчетов с примерами, использующими запросы OData и имеете базовое представление о Power BI.

Категория Требования
Уровни доступа - член проекта.
— По крайней мере базовый доступ .
Права доступа По умолчанию члены проекта имеют разрешение делать запросы к аналитике и создавать представления. Дополнительные сведения о других предварительных требованиях для включения служб и функций и общих действий отслеживания данных см. в разделе "Разрешения и предварительные требования для доступа к аналитике".

Примеры запросов

Следующие запросы возвращают данные из WorkItems набора сущностей для поддержки создания отчетов в форме сводной матрицы.

Примечание.

Сведения о доступных свойствах для фильтрации или отчета см в справочнике по метаданным для Azure Boards. Вы можете фильтровать свои запросы или возвращать свойства, используя любое из значений Property в разделе EntityType или значениях, доступных с EntitySet. Каждое EntitySet соответствует EntityType. Дополнительные сведения о типе данных каждого значения см. в метаданных, предоставленных для соответствующего EntityTypeзначения.

Сводная история указывает на функции дочерних пользовательских историй на основе пути к области

Скопируйте и вставьте следующий запрос Power BI непосредственно в окно Получить данные>Пустой запрос. Дополнительные сведения см. в разделе "Обзор примеров отчетов с помощью запросов OData".

let
    Source = OData.Feed("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?"
            &"$filter=WorkItemType eq 'Feature'"
            &" and State ne 'Cut'"
            &" and startswith(Area/AreaPath,'{areapath}')"
            &" and Descendants/any()"    
        &"& $select=WorkItemId,Title,WorkItemType,State,AreaSK"
        &"& $expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath),"        
            &"Descendants("
                &"$apply=filter(WorkItemType eq 'User Story')"
                &"/aggregate($count as CountOfUserStories, StoryPoints with sum as TotalStoryPoints)"
            &")", 
        null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4])  
in
    Source

Строки подстановки и разбивка запросов

Замените следующие строки значениями. Не включайте угловые скобки {}, используя замену. Например, если вашей организации присвоено имя Fabrikam, замените {organization} на Fabrikam, а не {Fabrikam}.

  • {organization} — Название организации
  • {project} — Имя проекта группы или полностью опустите "/{project}" для межпроектного запроса
  • {areapath} — Путь области. Пример формата: Project\Level1\Level2.

Разбивка запросов

В следующей таблице описана каждая часть запроса.

Часть запроса

Description

$filter=WorkItemType eq 'Feature'

Функции возврата.

and State ne 'Cut'

Пропустить закрытые баги.

and startswith(Area/AreaPath,'{areapath}')

Возвращайте рабочие элементы по определенному пути области, заменяющему Area/AreaPath eq '{areapath}', который возвращает элементы по конкретному пути области. Чтобы отфильтровать по имени команды, используйте инструкцию Teams/any(x:x/TeamName eq '{teamname})'фильтра.

and Descendants/any()

Включите все функции, даже те, которые не содержат пользовательских историй. Замените "any(d:d/WorkItemType eq "Пользовательская история"), чтобы не указывать функции, у которых нет дочерних историй пользователей.

&$select=WorkItemId, Title, WorkItemType, State

Выберите поля для возврата.

&$expand=AssignedTo($select=UserName), Iteration($select=IterationPath), Area($select=AreaPath),

Выберите поля AssignedTo, Iteration, Area расширяемых свойств.

Descendants(

Разверните Descendants условие.

$apply=filter(WorkItemType eq 'User Story')

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

/aggregate($count as CountOfUserStories, StoryPoints with sum as TotalStoryPoints)

Для всех потомков, соответствующих условию фильтра, подсчитайте их количество и суммируйте свойство StoryPoints.

)

Закрыть Descendants().

Сводная история указывает на функции дочерних пользовательских историй на основе Teams

Следующие запросы показывают, как создавать сводные отчёты, фильтруя по имени команды, вместо пути к области.

Скопируйте и вставьте следующий запрос Power BI непосредственно в окно Получить данные>Пустой запрос. Дополнительные сведения см. в разделе "Обзор примеров отчетов с помощью запросов OData".

let
    Source = OData.Feed("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?"
            &"$filter=WorkItemType eq 'Feature'"
            &" and State ne 'Cut'"
            &" and (Teams/any(x:x/TeamName eq '{teamname}') or Teams/any(x:x/TeamName eq '{teamname}') or Teams/any(x:x/TeamName eq '{teamname}'))"
            &" and Descendants/any()"    
        &"& $select=WorkItemId,Title,WorkItemType,State,AreaSK"
        &"& $expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath),"        
            &"Descendants("
                &"$apply=filter(WorkItemType eq 'User Story')"
                &"/aggregate($count as CountOfUserStories, StoryPoints with sum as TotalStoryPoints)"
            &")", 
        null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

Свертка истории указывает на эпические

С помощью следующих запросов можно свернуть историю в Epics.

Скопируйте и вставьте следующий запрос Power BI непосредственно в окно Получить данные>Пустой запрос. Дополнительные сведения см. в разделе "Обзор примеров отчетов с помощью запросов OData".

let
    Source = OData.Feed("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?"
            &"$filter=WorkItemType eq 'Epic'"
            &" and State ne 'Cut'"
            &" and startswith(Area/AreaPath,'{areapath}')"
            &" and Descendants/any(d:d/WorkItemType eq 'User Story')"    
        &"& $select=WorkItemId,Title,WorkItemType,State,AreaSK"
        &"& $expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath),"        
            &"Descendants("
                &"$apply=filter(WorkItemType eq 'User Story')"
                &"/aggregate(StoryPoints with sum as TotalStoryPoints)"
            &")", 
        null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4])  
in
    Source

Свертки задач, оставшихся рабочих и завершенных работ для пользовательских историй

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

Скопируйте и вставьте следующий запрос Power BI непосредственно в окно Получить данные>пустого запроса. Дополнительные сведения см. в разделе "Обзор примеров отчетов с помощью запросов OData".

let
    Source = OData.Feed("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?"
            &"$filter=WorkItemType eq 'User Story'"
            &" and State ne 'Removed'"
            &" and startswith(Area/AreaPath,'{areapath}')"
            &" and Descendants/any()"    
        &"& $select=WorkItemId,Title,WorkItemType,State,AreaSK"
        &"& $expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath),"        
            &"Descendants("
                &"$apply=filter(WorkItemType eq 'Task')"
                &"/aggregate(RemainingWork with sum as TotalRemainingWork, CompletedWork with sum as TotalCompletedWork)"
            &")", 
        null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4])  
in
    Source

Суммарное количество ошибок в функциях

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

Скопируйте и вставьте следующий запрос Power BI непосредственно в окно Получение данныхПустой запрос. Дополнительные сведения см. в разделе "Обзор примеров отчетов с помощью запросов OData".

let
    Source = OData.Feed("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?"
            &"$filter=WorkItemType eq 'Feature'"
            &" and State ne 'Removed'"
            &" and startswith(Area/AreaPath,'{areapath}')"
            &" and Descendants/any()"    
        &"& $select=WorkItemId,Title,WorkItemType,State,AreaSK"
        &"& $expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath),"        
            &"Descendants("
                &"$apply=filter(WorkItemType eq 'Bug')"
                &"/aggregate($count as CountOfBugs)"
            &")", 
        null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4])  
in
    Source

(Необязательно) Переименование запроса

Вы можете переименовать метку запроса по умолчанию, query1, в что-то более понятное. Просто введите новое имя в панели параметров запроса.

Снимок экрана: параметры меню запроса Power BI, переименование запроса.

Развернуть столбцы в Power BI

Предложение &$expand=AssignedTo($select=UserName), Iteration($select=IterationPath), Area($select=AreaPath) возвращает записи, содержащие несколько полей. Прежде чем создать отчет, необходимо развернуть запись и преобразовать её в определённые поля. В этом случае вам следует развернуть следующие записи:

  • AssignedTo
  • AreaPath
  • IterationPath

Чтобы узнать, как, см. статью Преобразование данных аналитики для создания отчетов Power BI.

(Необязательно) Переименование полей

После того как вы развернули столбцы, вам может потребоваться переименовать одно или несколько полей. Например, можно переименовать столбец с AreaPath на Area Path. Сведения о том, как это сделать, см. в разделе "Переименовать поля столбцов".

Замена значений NULL в полях свертки

Если рабочий элемент не имеет дочерних элементов, значение свертки может иметь значение NULL. Например, Descendants.CountOfUserStories имеет значение "null", если функция не имеет дочерних историй пользователей.

Чтобы упростить отчеты, замените все значения NULL нулем, выполнив следующие действия.

  1. Выберите столбец, щелкнув заголовок столбца.
  2. Выберите меню "Преобразование".
  3. Выберите " Заменить значения". Откроется диалоговое окно "Заменить значения ".
  4. Введите "null" в поле Значение для поиска.
  5. Введите "0" в Заменить на.
  6. Выберите OK.

Повторите это для всех столбцов свертки.

Закройте запрос и примените изменения

Завершив все преобразования данных, нажмите кнопку "Закрыть" и "Применить " из меню "Главная ", чтобы сохранить запрос и вернуться на вкладку "Отчет " в Power BI.

Снимок экрана редактора Power Query: вариант

Создание табличного отчета

  1. В Power BI выберите отчет "Таблица" в разделе "Визуализации".

    Снимок экрана: выбор визуализаций и полей Power BI для отчета о сводной таблице.

  2. Добавьте следующие поля в столбцы в указанном порядке:

    • WorkItemI, выберите "Не резюмировать" для отображения идентификатора при необходимости
    • WorkItemType
    • Title
    • State
    • Count of User Stories
    • Total Story Points.

Пример отчета отображается.

Снимок экрана: сводный отчет матрицы функций.