자식 작업 항목 값을 부모 샘플 보고서에 롤업
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
롤업은 작업 항목의 개수 또는 스토리 포인트, 남은 작업 시간 또는 자식 항목의 다른 사용자 지정 필드의 합계를 표시하도록 지원합니다. 이 문서에서는 자식 작업 항목이 포함된 Epics, Features 또는 User Stories에 대한 테이블 형식 롤업 보고서를 생성하는 방법에 대한 몇 가지 예제를 제공합니다. 다음 이미지는 부모 기능에 대해 롤업된 Story Points의 예를 보여 줍니다.
롤업 및 롤업을 표시하는 옵션에 대한 자세한 내용은 Azure Boards의 표시 롤업 진행률 또는 합계를 참조 하세요.
참고 항목
이 문서에서는 OData 쿼리를 사용하여 샘플 보고서 개요를 읽고 Power BI에 대한 기본적인 이해를 가지고 있다고 가정합니다 .
필수 조건
- 액세스: 최소한 기본 액세스 권한이 있는 프로젝트의 멤버여야 합니다.
- 사용 권한: 기본적으로 프로젝트 멤버는 분석을 쿼리하고 뷰를 만들 수 있는 권한이 있습니다.
- 서비스 및 기능 사용 및 일반 데이터 추적 활동과 관련된 기타 필수 구성 요소에 대한 자세한 내용은 Analytics에 액세스하기 위한 사용 권한 및 필수 구성 요소를 참조 하세요.
샘플 쿼리
다음 쿼리는 롤업 매트릭스 보고서 생성을 WorkItems
지원하기 위해 엔터티 집합의 데이터를 반환합니다.
참고 항목
필터 또는 보고서 용도로 사용 가능한 속성을 확인하려면 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"{organization}
Fabrikam
{Fabrikam}
인 경우 .
{organization}
- 조직 이름{project}
- 프로젝트 간 쿼리의 경우 팀 프로젝트 이름 또는 "/{project}"를 완전히 생략합니다.{areapath}
- 영역 경로입니다. 예제 형식:Project\Level1\Level2
.
쿼리 분석
다음 표에서는 쿼리의 각 부분을 설명합니다.
쿼리 파트
설명
$filter=WorkItemType eq 'Feature'
기능을 반환합니다.
and State ne 'Cut'
닫힌 버그를 생략합니다.
and startswith(Area/AreaPath,'{areapath}')
특정 영역 경로에서 작업 항목을 반환하고 특정 영역 경로의 반환 항목을 바꿔 Area/AreaPath eq '{areapath}'
서 반환합니다.
팀 이름으로 필터링하려면 필터 문을 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 쿼리를 복사하여 데이터>빈 쿼리 가져오기 창에 직접 붙여넣습니다. 자세한 내용은 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로 롤업할 수 있습니다.
다음 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 보고서를 생성합니다.
(선택 사항) 필드 이름 바꾸기
열을 확장한 후에는 하나 이상의 필드 이름을 바꿀 수 있습니다. 예를 들어 열 AreaPath
Area Path
의 이름을 .로 바꿀 수 있습니다. 방법을 알아보려면 열 필드 이름을 바꿉니다.
롤업 필드의 null 값 바꾸기
작업 항목에 자식이 없으면 롤업 값이 null일 수 있습니다. 예를 들어, 기능에 자식 사용자 스토리가 없는 경우 Descendants.CountOfUserStories 는 "null"입니다.
더 쉽게 보고하려면 다음 단계에 따라 모든 null을 0으로 바꿉니다.
- 열 머리글을 클릭하여 열을 선택합니다.
- 변환 메뉴를 선택합니다.
- 값 바꾸기를 선택합니다. 값 바꾸기 대화 상자가 나타납니다.
- 찾을 값에 "null"을 입력합니다.
- 바꾸기에 "0"을 입력합니다.
- 확인을 선택합니다.
모든 롤업 열에 대해 반복합니다.
쿼리를 닫고 변경 내용 적용
모든 데이터 변환을 완료한 후 홈 메뉴에서 닫기 및 적용 을 선택하여 쿼리를 저장하고 Power BI의 보고서 탭으로 돌아갑니다.
테이블 보고서 만들기
Power BI의 시각화에서 테이블 보고서를 선택합니다.
다음 필드를 표시된 순서대로 열에 추가합니다 .
WorkItemI
필요한 경우 ID를 표시하도록 요약하지 않음을 선택합니다.WorkItemType
Title
State
Count of User Stories
Total Story Points
.
보고서 예제가 표시됩니다.