將子工作專案值匯總至父範例報表

Azure DevOps Services |Azure DevOps Server 2022 - Azure DevOps Server 2019

匯總支持顯示工作項目計數或故事點、剩餘工時或其他子專案的自定義字段總和。 本文提供數個範例,說明如何針對包含子工作專案的 Epics、Features 或 User Storys 產生表格式匯總報表。 下圖顯示為其父功能匯總的故事點範例。

功能匯總矩陣報表的螢幕快照。

若要深入了解匯總和顯示匯總的選項,請參閱 在 Azure Boards 中顯示匯總進度或總計。

注意

本文假設您已閱讀 使用 OData 查詢 的範例報表概觀,並具備 Power BI 的基本瞭解。

必要條件

  • 若要檢視分析數據和查詢服務,您必須是具有基本存取權或更高許可權的項目成員。 根據預設,所有專案成員都會獲得查詢分析的許可權,並定義分析檢視。
  • 若要瞭解有關服務與功能啟用和一般數據追蹤活動的其他必要條件,請參閱 存取分析的許可權和必要條件。

範例查詢

下列查詢會從 WorkItems 實體集傳回數據,以支持產生匯總矩陣報表。

注意

若要判斷篩選或報表用途的可用屬性,請參閱 Azure Boards 的元數據參考。 您可以使用的 或 NavigationPropertyBinding PathEntitySet底下EntityType的任何Property值來篩選查詢或傳回屬性。 每個 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

查詢明細

下表描述查詢的每個部分。

查詢元件

說明

$filter=WorkItemType eq 'Feature'

傳回功能。

and State ne 'Cut'

省略已關閉的 Bug。

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

傳回特定區域路徑下的工作專案,取代 Area/AreaPath eq '{areapath}' 特定區域路徑上的傳回專案。 若要依 Team Name 進行篩選,請使用 filter 語句 Teams/any(x:x/TeamName eq '{teamname})'

and Descendants/any()

包含所有功能,即使是沒有用戶劇本的功能。 將 取代為 “any(d:d/WorkItemType eq 'User Story')”,以省略沒有子用戶劇本的功能。

&$select=WorkItemId, Title, WorkItemType, State

選取要傳回的欄位。

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

選取可展開的屬性欄位AssignedTo、、 AreaIteration

Descendants(

Descendants展開 子句。

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

篩選子系,只包含用戶劇本(省略工作和 Bug)。

/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

匯總故事點至 Epic

您可以使用下列查詢將故事點匯總至 Epic。

您可以將下面所列的 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

匯總工作剩餘工時和已完成工時給用戶劇本

下列查詢顯示如何將剩餘工時和已完成工作匯總至階層中的User Storys子工作。 這些查詢假設工作會指派為指定 區域路徑中用戶劇本的子系。

您可以將下面所列的 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

匯總 Bug 計數至功能

下列查詢示範如何匯總指派給功能的錯誤計數。 這些查詢假設 Bug 定義為指定 區域路徑中功能子系。

您可以將下面所列的 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。 例如,如果 Feature 沒有任何子用戶劇本, 則 Descendants.CountOfUserStories 為 “null”。

為了方便報告,請遵循下列步驟,將所有 Null 取代為零。

  1. 按兩下資料列標頭以選取資料行。
  2. 選取 [ 轉換 ] 功能表。
  3. 選取 [ 取代值]。 [ 取代值] 對話框隨即出現。
  4. 在 [要尋找的值] 中輸入 “null”。
  5. 在 [取代為] 中輸入 “0”。
  6. 選擇確定

針對所有匯總數據行重複。

關閉查詢並套用您的變更

完成所有數據轉換之後,請從 [常用] 功能表選擇 [關閉及套用],以儲存查詢並返回 Power BI 中的 [報表] 索引卷標。

Power Query 編輯器 [關閉並套用] 選項的螢幕快照。

建立數據表報表

  1. 在 Power BI 中,選擇 [視覺效果] 底下的 [數據表] 報表。

    匯總數據表報表的Power BI視覺效果和字段選取專案的螢幕快照。

  2. 依指示的順序,將下列欄位新增至資料行:

    • WorkItemI,選擇 [不摘要 ] 視需要顯示標識符
    • WorkItemType
    • Title
    • State
    • Count of User Stories
    • Total Story Points.

範例報表隨即顯示。

範例功能匯總矩陣報表的螢幕快照。