DAX-выражение для подсумм - PullRequest
       10

DAX-выражение для подсумм

0 голосов
/ 11 января 2019

У меня есть следующий набор данных на основе VSTS Task, User Story, Feature, Epic иерархии

Id | Parent ID | Hours completed | Aggregated hours
1  |           |
2  | 1         | 
3  | 2         | 3
4  | 2         | 4
5  | 1         | 
6  | 5         | 2
7  | 5         | 5

Я хочу посчитать для каждой строки, каково общее количество часов, рассчитанное как сумма всех его детей. Это означает, что я хочу знать, сколько часов было потрачено на историю пользователя, на функцию, на эпос.

Id | Parent ID | Hours completed | Aggregated hours
1  |           |                 | 15 (3+4+2+6)
2  | 1         |                 | 7 (3+4)
3  | 2         | 3
4  | 2         | 4
5  | 1         |                 | 8 (2+6)
6  | 5         | 2
7  | 5         | 6

Я попытался денормализовать иерархию, чтобы у меня был уровень иерархии в виде столбца, основанного на https://www.daxpatterns.com/parent-child-hierarchies/

Id | Parent ID | Level 1 | Level 2 | Hours completed | Aggregated hours
1  |           |         |         |                | 15 (3+4+2+6)
2  | 1         |   1     |         |                | 7 (3+4)
3  | 2         |   1     | 2       | 3
4  | 2         |   1     | 2       | 4
5  | 1         |   1     |         |                | 8 (2+6)
6  | 5         |   1     | 5       | 2
7  | 5         |   1     | 5       | 6

Но это ни к чему не привело ... Есть ли способ достичь этого в Power BI? Пробовал SUMX, но все еще далек от правильных результатов

EstCumulativeHoursCompleted = 
    CALCULATE(
        SUMX('Work Items - Today', 'Work Items - Today'[Completed Work]),
        'Work Items - Today'[Parent Work Item Id] = EARLIER('Work Items - 
    Today'[Work Item Id])

)

Спасибо за подсказки!

P.S. По предложению Алексея мне удалось получить это:

enter image description here

1 Ответ

0 голосов
/ 11 января 2019

Это идеальная ситуация для использования родительских и дочерних функций !

Вы можете определить путь с разделителями трубы, используя функцию 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.

...