首页 > 解决方案 > 子和的 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])

)

感谢您的一些提示!

PS根据Alexis的建议,我设法得到了这个:

在此处输入图像描述

标签: azure-devopspowerbidax

解决方案


这是使用父子函数的完美情况!

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


推荐阅读