我正在尝试在Excel的PowerPivot中创建一个计算字段,并且无法获得我想要的结果。具体来说,我试图从summalic或groupby子句的结果中的后续列中获取具有最高值的项的名称。
示例数据:
计算分为两个步骤:
在这个例子中,最终结果应该是“D”,因为“D”的小时数是最高的(10)。
我可以使用此计算字段确定最长的小时数:
Test:=MAXX(Summarize(ExampleTable, [Project], "TotalHours", Sum([Hours])), [TotalHours])
我不确定如何调整此计算字段或创建新的计算字段以返回“D”。
更复杂的是,结果必须将当前的过滤器上下文放到示例中,这样无论用户做什么,结果总是正确的。这是一组更强大的样本数据和预期结果:
以下是以小时为单位的预期结果。对于每个黄色单元格,我希望计算字段的结果是项目的名称(A-E)。
以下是显示MaxHours而非项目名称的实际报告示例。我的目标是显示项目名称而不是MaxHours。 (随意忽略小计)。
MaxHours:=MAXX(SUMMARIZE(Table1,[Project],"Total Hours",sum([Hours])),[Total Hours])
以下是没有小计的示例结果:
注意:对于这个问题,我们可以假设没有联系。
答案 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)但您应该希望在真实数据集中没有这个问题。
解决方案:
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)
希望这有帮助