子作業項目の値を親サンプル レポートにロールアップする
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
ロールアップでは、作業項目の数またはストーリー ポイント、残存作業時間、またはその他の子項目のユーザー設定フィールドの合計を表示するサポートが提供されます。 この記事では、子作業項目を含むエピック、フィーチャー、またはユーザー ストーリーの表形式ロールアップ レポートを生成する方法の例をいくつか示します。 次の図は、親フィーチャー用にロールアップされたストーリー ポイントの例を示しています。
ロールアップとロールアップを表示するオプションの詳細については、「 Azure Boards でのロールアップの進行状況または合計を表示する」を参照してください。
Note
この記事では、 OData クエリを使用したサンプル レポートの概要 Power BI の基本的な理解があることを前提としています。
前提条件
- Access:少なくとも Basic アクセス権を持つプロジェクトのメンバーである必要があります。
- Permissions: 既定では、プロジェクト メンバーには Analytics にクエリを実行してビューを作成する権限があります。
- サービスと機能の有効化と一般的なデータ追跡アクティビティに関するその他の前提条件の詳細については、「 Analytics にアクセスするためのアクセス許可と前提条件を参照してください。
サンプル クエリ
次のクエリは、ロールアップ マトリックス レポートの生成をサポートするために、 WorkItems
エンティティ セットからデータを返します。
Note
フィルターまたはレポートの目的で使用できるプロパティを確認するには、「Azure Boardsのメタデータ リファレンス」を参照してください。 クエリをフィルター処理したり、 で使用可能な または 値のProperty
下EntityType
NavigationPropertyBinding Path
の値のいずれかを使用してプロパティをEntitySet
返したりできます。 各 は EntitySet
に EntityType
対応します。 各値のデータ型の詳細については、対応する EntityType
に指定されたメタデータを確認してください。
エリア パスに基づく子ユーザー ストーリーの機能をポイントするロールアップ ストーリー
次の Power BI クエリをコピーして、 Get Data>Blank クエリ ウィンドウに直接貼り付けます。 詳細については、「 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
、 Iteration
、 Area
を選択します。
Descendants(
Descendants
句を展開します。
$apply=filter(WorkItemType eq 'User Story')
子孫をフィルター処理して、ユーザー ストーリーのみを含めます (タスクとバグは省略されます)。
/aggregate($count as CountOfUserStories, StoryPoints with sum as TotalStoryPoints)
フィルター句に一致するすべての子孫について、それらをカウントし、 StoryPoints
プロパティを合計します。
)
Descendants()
を終了します。
Teams に基づく子ユーザー ストーリーの機能をポイントするロールアップ ストーリー
次のクエリは、エリア パスではなくチーム名でフィルター処理するロールアップ レポートを生成する方法を示しています。
次の Power BI クエリをコピーして、 Get Data>Blank クエリ ウィンドウに直接貼り付けます。 詳細については、「 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 クエリをコピーして、 Get Data>Blank クエリ ウィンドウに直接貼り付けます。 詳細については、「 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
作業の残りと完了した作業をユーザー ストーリーにロールアップする
次のクエリは、階層のユーザー ストーリーに子タスクに割り当てられた 作業 と Completed Work をロールアップする方法を示しています。 これらのクエリでは、指定した Area Path 内のユーザー ストーリーの子としてタスクが割り当てられていることを前提としています。
次の Power BI クエリをコピーして、 Get Data>Blank クエリ ウィンドウに直接貼り付けます。 詳細については、「 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
機能のロールアップ のバグ数
次のクエリは、フィーチャーに割り当てられたバグの数をロールアップする方法を示しています。 これらのクエリでは、指定した Area Path のフィーチャーの子としてバグが定義されていることを前提としています。
次の Power BI クエリをコピーして、 Get Data>Blank クエリ ウィンドウに直接貼り付けます。 詳細については、「 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
方法については、「 Transform Analytics データを使用して Power BI レポートを生成するを参照してください。
(省略可能)フィールドの名前を変更する
列を展開したら、1 つ以上のフィールドの名前を変更できます。 たとえば、列 AreaPath
の名前を Area Path
に変更できます。 方法については、「 Rename 列フィールドを参照してください。
ロールアップ フィールドの null 値を置き換える
作業項目に子がない場合、ロールアップ値は null になる可能性があります。 たとえば、フィーチャーに子ユーザー ストーリーがない場合、 Descendants.CountOfUserStories は "null" になります。
レポートを簡単にするために、次の手順に従って、すべての null を 0 に置き換えます。
- 列ヘッダーをクリックして列を選択します。
- Transform メニューを選択します。
- [値 置き換えを選択します。 [値の配置] ダイアログが表示されます。
- Value to Find に「null」と入力します。
- Replace Withに「0」と入力します。
- OK を選択します。
すべてのロールアップ列に対して繰り返します。
クエリを閉じて変更を適用する
すべてのデータ変換が完了したら、Home メニューから Close & Apply を選択してクエリを保存し、Power BI の Report タブに戻ります。
テーブル レポートを作成する
Power BI で、Visualizations で Table レポートを選択します。
次のフィールドを Columns 指定された順序で追加します。
WorkItemI
をクリック [集計しない を選択して、必要に応じて ID を表示しますWorkItemType
Title
State
Count of User Stories
Total Story Points
.
レポートの例が表示されます。