共用方式為


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

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

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

特性匯總矩陣報表的截圖。

如需匯總和顯示匯總選項的詳細資訊,請參閱 在 Azure Boards 中顯示匯總進度或總計。

注意

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

類別 要求
存取層級 - 專案成員
- 至少擁有 基本 存取權限。
許可 根據預設,項目成員具有查詢分析及建立檢視的許可權。 如需有關服務與功能啟用和一般數據追蹤活動之其他必要條件的詳細資訊,請參閱 存取分析的許可權和必要條件。

範例查詢

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

注意

若要判斷篩選或報表用途的可用屬性,請參閱 Azure Boards 的元數據參考。 您可以使用EntitySet的可用Property值來篩選查詢或返回屬性,這些值是EntityTypeNavigationPropertyBinding Path底下的任何一種。 每個 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、、 IterationArea

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

您可以使用下列查詢將故事點匯總至 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

彙整工作剩餘工時和已完成工時至使用者故事

下列查詢顯示如何將分配給子任務的剩餘工時已完成工作匯總至階層中的使用者故事。 這些查詢假設將工作指派為指定 區域路徑內使用者故事的子系。

將下列 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。 若要瞭解如何,請參閱 重新命名數據行欄位

取代匯總欄位中的空值

如果工作項目沒有任何子系,匯總值可能是空值。 例如,若一個功能沒有任何子用戶故事,則 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.

範例報表隨即顯示。

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