子作業項目の値を親サンプル レポートにロールアップする
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
ロールアップでは、作業項目の数またはストーリー ポイント、残存作業時間、またはその他の子項目のユーザー設定フィールドの合計を表示するサポートが提供されます。 この記事では、子作業項目を含むエピック、フィーチャー、またはユーザー ストーリーの表形式ロールアップ レポートを生成する方法の例をいくつか示します。 次の図は、親フィーチャー用にロールアップされたストーリー ポイントの例を示しています。
ロールアップとロールアップを表示するオプションの詳細については、「Azure Boards でのロールアップの進行状況または合計の表示」を参照してください。
Note
この記事では、OData クエリを使用したサンプル レポートの概要を読み、Power BI の基本的な理解を持っていることを前提としています。
前提条件
- アクセス: 少なくとも Basic アクセス権を持つプロジェクトのメンバーである。
- 権限: 既定では、プロジェクト メンバーは Analytics にクエリを実行し、ビューを作成する権限を持ちます。
- サービスと機能の有効化と一般的なデータ追跡アクティビティに関するその他の前提条件の詳細については、「Analytics にアクセスするためのアクセス許可と前提条件」を参照してください。
サンプル クエリ
次のクエリは、ロールアップ マトリックス レポートの生成を WorkItems
サポートするために、エンティティ セットからデータを返します。
Note
フィルターまたはレポートの目的で使用できるプロパティを確認するには、「Azure Boardsのメタデータ リファレンス」を参照してください。 クエリをフィルター処理したり、 で使用可能な または 値のProperty
下EntityType
NavigationPropertyBinding Path
の値のいずれかを使用してプロパティを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" の場合は、 ではなく {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
、、 Area
Iteration
を選択します。
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 で列を展開する
この句は &$expand=AssignedTo($select=UserName), Iteration($select=IterationPath), Area($select=AreaPath)
、複数のフィールドを含むレコードを返します。 レポートを作成する前に、レコードを展開して特定のフィールドにフラット化する必要があります。 この例では、次のレコードを展開します。
AssignedTo
AreaPath
IterationPath
方法については、「Analytics データを変換して Power BI レポートを生成する」を参照してください。
(省略可能)フィールドの名前を変更する
列を展開したら、1 つ以上のフィールドの名前を変更できます。 たとえば、列AreaPath
Area Path
の名前を . 方法については、「列フィールドの名前を変更する」を参照してください。
ロールアップ フィールドの null 値を置き換える
作業項目に子がない場合、ロールアップ値は null になる可能性があります。 たとえば、 機能に子ユーザー ストーリーがない場合、Descendants.CountOfUserStories は "null" になります。
レポートを簡単にするために、次の手順に従って、すべての null を 0 に置き換えます。
- 列ヘッダーをクリックして列を選択します。
- [変換] メニューを選択します。
- [値の置換] を選択 します。 [値の置換] ダイアログが表示されます。
- [検索する値] に 「null」と入力します。
- [置換後の文字列] に「0」と入力します。
- OK を選択します。
すべてのロールアップ列に対して繰り返します。
クエリを閉じて変更を適用する
すべてのデータ変換が完了したら、[ホーム] メニューから [閉じる] & [適用] を選択してクエリを保存し、Power BI の [レポート] タブに戻ります。
テーブル レポートを作成する
Power BI で、[視覚化] の下の [テーブル] レポートを選択します。
次のフィールドを指定 された順序で列 に追加します。
WorkItemI
を選択し、[必要に応じて ID を表示するために集計しない] を選択しますWorkItemType
Title
State
Count of User Stories
Total Story Points
.
レポートの例が表示されます。