使用Summarize时如何获取最大值的ID

时间:2016-12-13 01:19:31

标签: powerpivot powerbi dax

我正在尝试在Excel的PowerPivot中创建一个计算字段,并且无法获得我想要的结果。具体来说,我试图从summalic或groupby子句的结果中的后续列中获取具有最高值的项的名称。

示例数据:

Sample Data:

计算分为两个步骤:

  1. 按项目总计小时数
  2. 返回具有最高金额的项目的名称/ ID
  3. 在这个例子中,最终结果应该是“D”,因为“D”的小时数是最高的(10)。

    我可以使用此计算字段确定最长的小时数:

    Test:=MAXX(Summarize(ExampleTable, [Project], "TotalHours", Sum([Hours])), [TotalHours])

    我不确定如何调整此计算字段或创建新的计算字段以返回“D”。

    更复杂的是,结果必须将当前的过滤器上下文放到示例中,这样无论用户做什么,结果总是正确的。这是一组更强大的样本数据和预期结果:

    Complicated Example

    以下是以小时为单位的预期结果。对于每个黄色单元格,我希望计算字段的结果是项目的名称(A-E)。

    Expected results

    以下是显示MaxHours而非项目名称的实际报告示例。我的目标是显示项目名称而不是MaxHours。 (随意忽略小计)。

    Sample Report

    MaxHours:=MAXX(SUMMARIZE(Table1,[Project],"Total Hours",sum([Hours])),[Total Hours])

    以下是没有小计的示例结果:

    Sample results

    注意:对于这个问题,我们可以假设没有联系。

2 个答案:

答案 0 :(得分:1)

我认为使用数据透视表中的内置工具(如前N或排序)可以使用最大小时数来确定项目的最简单方法。

然而,此解决方案仅使用DAX计算。

首先创建计算列

Rank =
RANKX (
    ExampleTable,
    CALCULATE (
        SUM ( ExampleTable[Hours] ),
        FILTER ( ExampleTable, [Project] = EARLIER ( ExampleTable[Project] ) )
    ),
    ,
    ,
    DENSE
)

然后使用该列通过创建度量来确定项目ID /名称:

Max Hours Project =
CALCULATE (
    FIRSTNONBLANK ( ExampleTable[Project], 0 ),
    FILTER ( ExampleTable, [Rank] = 1 )
)

在这种情况下,我使用了FIRSTNONBLANK函数,因为示例中项目的名称是Text类型。如果它实际上是一个数字,您可以用MAX函数替换它。

另请注意,计算列与度量不同,两者都是在不同范围内执行的计算。计算列由每一行执行,而度量可以在一组行上执行。

如果有帮助,请告诉我。

答案 1 :(得分:1)

好的,这是我的解决方案,如下图所示。它似乎工作。请注意,此数据中存在关联(例如,Dog和Bar在A和C之间具有联系,因此它选择了A)但您应该希望在真实数据集中没有这个问题。

enter image description here

解决方案:

1)创建一个度量,我将其称为“小时总计”。为您希望能够钻取它的所有字段指定ALLEXCEPT()非常重要(在这种情况下,它将是“Person”和“Type”:

CALCULATE(SUM([Hours]),ALLEXCEPT(ExampleTable,ExampleTable[Project],ExampleTable[Person],ExampleTable[Type]))

2)创建一个度量,我称之为“顶级项目”。此度量使用前一个度量,使用TOPN()函数简单地计算顶层项目。如果是关系,我在它周围包裹了FIRSTNONBLANK()。

=FIRSTNONBLANK(TOPN(1,VALUES(ExampleTable[Project]),[Hours Total]),1)

希望这有帮助