子作業項目の値を親サンプル レポートにロールアップする

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

ロールアップでは、作業項目の数またはストーリー ポイント、残存作業時間、またはその他の子項目のユーザー設定フィールドの合計を表示するサポートが提供されます。 この記事では、子作業項目を含むエピック、フィーチャー、またはユーザー ストーリーの表形式ロールアップ レポートを生成する方法の例をいくつか示します。 次の図は、親フィーチャー用にロールアップされたストーリー ポイントの例を示しています。

機能ロールアップ マトリックス レポートのスクリーンショット。

ロールアップとロールアップを表示するオプションの詳細については、「Azure Boards でのロールアップの進行状況または合計の表示」を参照してください

Note

この記事では、OData クエリを使用したサンプル レポートの概要を読み、Power BI の基本的な理解を持っていることを前提としています。

前提条件

サンプル クエリ

次のクエリは、ロールアップ マトリックス レポートの生成を WorkItems サポートするために、エンティティ セットからデータを返します。

Note

フィルターまたはレポートの目的で使用できるプロパティを確認するには、「Azure Boardsのメタデータ リファレンス」を参照してください。 クエリをフィルター処理したり、 で使用可能な または 値のPropertyEntityTypeNavigationPropertyBinding Pathの値のいずれかを使用してプロパティをEntitySet返したりできます。 各 は EntitySetEntityType対応します。 各値のデータ型の詳細については、対応する 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" の場合は、 ではなく {Fabrikam}を にFabrikam置き換えます{organization}

  • {organization} - 組織名
  • {project} - プロジェクト間クエリの場合は、チーム プロジェクト名を指定するか、"/{project}" を完全に省略します
  • {areapath} - エリア パス。 形式の例: Project\Level1\Level2

クエリの内訳

次の表では、クエリの各部分について説明します。

クエリ パーツ

説明

$filter=WorkItemType eq 'Feature'

戻り値の特徴。

and State ne 'Cut'

終了したバグを省略します。

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

特定のエリア パスの下にある作業項目を返します。置き換えると Area/AreaPath eq '{areapath}' 、特定のエリア パスにあるアイテムが返されます。 チーム名でフィルター処理するには、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')

子孫をフィルター処理して、ユーザー ストーリーのみを含めます (タスクとバグは省略されます)。

/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

ストーリーポイントをエピックに重ね合わせる

次のクエリを使用して、ストーリー ポイントをエピックにロールアップできます。

次の 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

方法については、「Analytics データを変換して Power BI レポートを生成する」を参照してください

(省略可能)フィールドの名前を変更する

列を展開したら、1 つ以上のフィールドの名前を変更できます。 たとえば、列AreaPathArea Pathの名前を . 方法については、「列フィールドの名前を変更する」を参照してください

ロールアップ フィールドの null 値を置き換える

作業項目に子がない場合、ロールアップ値は null になる可能性があります。 たとえば、 機能に子ユーザー ストーリーがない場合、Descendants.CountOfUserStories は "null" になります。

レポートを簡単にするために、次の手順に従って、すべての null を 0 に置き換えます。

  1. 列ヘッダーをクリックして列を選択します。
  2. [変換] メニューを選択します。
  3. [値の置換] を選択 します。 [値置換] ダイアログが表示されます。
  4. [検索する値] に 「null」と入力します
  5. [置換後の文字列] に「0」と入力します。
  6. OK を選択します。

すべてのロールアップ列に対して繰り返します。

クエリを閉じて変更を適用する

すべてのデータ変換が完了したら、[ホーム] メニューから [閉じる] & [適用] を選択してクエリを保存し、Power BI の [レポート] タブに戻ります。

[閉じて適用] オプションPower Query エディタースクリーンショット。

テーブル レポートを作成する

  1. Power BI で、[視覚化] の下の [テーブル] レポートを選択します

    ロールアップ テーブル レポートの Power BI の [視覚化] と [フィールド] の選択のスクリーンショット。

  2. 次のフィールドを指定 された順序で列 に追加します。

    • WorkItemIを選択し、[必要に応じて ID を表示するために集計しない] を選択します
    • WorkItemType
    • Title
    • State
    • Count of User Stories
    • Total Story Points.

レポートの例が表示されます。

サンプル機能ロールアップ マトリックス レポートのスクリーンショット。