Это идеальная ситуация для использования родительских и дочерних функций !
Вы можете определить путь с разделителями трубы, используя функцию PATH
.
Path = PATH('Work Items'[Id], 'Work Items'[Parent ID])
Добавление этого в ваш стартовый стол выглядит следующим образом:
Id | Parent ID | Hours completed | Path
1 | | | 1
2 | 1 | | 1|2
3 | 2 | 3 | 1|2|3
4 | 2 | 4 | 1|2|4
5 | 1 | | 1|5
6 | 5 | 2 | 1|5|6
7 | 5 | 6 | 1|5|7
Если у вас есть это, вы можете суммировать часы для каждого пути, который содержит текущий Id
.
Aggregated hours =
CALCULATE (
SUM ( 'Work Items'[Hours completed] ),
FILTER (
'Work Items',
PATHCONTAINS (
'Work Items'[Path], --Path column
EARLIER ( 'Work Items'[Id] ) )
)
)
Вы также можете пропустить промежуточный столбец Path
и просто включить определение пути в PATHCONTAINS
вместо ссылки на этот столбец.
Aggregated hours =
CALCULATE (
SUM ( 'Work Items'[Hours completed] ),
FILTER (
'Work Items',
PATHCONTAINS (
PATH ( 'Work Items'[Id], 'Work Items'[Parent ID] ), --Path Definition
EARLIER ( 'Work Items'[Id] )
)
)
)
Если вы сохраните столбец Path
, ваша таблица должна выглядеть следующим образом.
Id | Parent ID | Hours completed | Path | Aggregated hours
1 | | | 1 | 15
2 | 1 | | 1|2 | 7
3 | 2 | 3 | 1|2|3 | 3
4 | 2 | 4 | 1|2|4 | 4
5 | 1 | | 1|5 | 8
6 | 5 | 2 | 1|5|6 | 2
7 | 5 | 6 | 1|5|7 | 6
Если вам не нужны агрегаты для самых низких уровней, вы можете отфильтровать строки, где PATHLENGTH
равно максимальному PATHLENGTH
.