小和的DAX表达式

时间:2019-01-11 16:13:37

标签: azure-devops powerbi dax

我有一个基于VSTS任务,用户故事,功能,史诗层次结构的数据集

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。根据亚历克西斯(Alexis)的建议,我设法做到了这一点:

enter image description here

1 个答案:

答案 0 :(得分:2)

这是使用Parent and Child functions的完美情况!

您可以使用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的行。