分享方式:


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

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.

範例報表隨即顯示。

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