Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powerbi 类别内的DAX RANKX_Powerbi_Dax - Fatal编程技术网

Powerbi 类别内的DAX RANKX

Powerbi 类别内的DAX RANKX,powerbi,dax,Powerbi,Dax,如何计算类别内的排名?假设我们有以下预期结果的样本数据: 我四处寻找线索。根据上面显示的模式,我能够编写以下代码: Rank within category = RANKX ( FILTER ( ALL ( 'MyTable'[Category], 'MyTable'[Subcategory] ), 'MyTable'[Category] = MAX ( 'MyTab

如何计算类别内的排名?假设我们有以下预期结果的样本数据:

我四处寻找线索。根据上面显示的模式,我能够编写以下代码:

Rank within category =
RANKX (
    FILTER (
        ALL (
            'MyTable'[Category],
            'MyTable'[Subcategory]
        ),
        'MyTable'[Category]
            = MAX ( 'MyTable'[Category] )
    ),
    CALCULATE (
        SUM ( 'MyTable'[Sales] )
    )
)
上面的代码产生了预期的结果,但我不知道它是如何工作的。你能解释一下吗

更新。

我找到了另一种简单的方法,它有几行优美的线条,但它的工作原理对我来说仍然是一个令人费解的谜。你能解释一下吗

Rank within category using variables = 

VAR TotalSalesThisItem = [SalesMeasure] // a variable to hold each item's sales

// now count how many items have sales which match or exceed this
RETURN
    COUNTROWS (
        FILTER (
            ALL ( MyTable[Subcategory] ),
            [SalesMeasure] >= TotalSalesThisItem
        )
    )

这段代码的神秘之处在于它如何知道什么是类别?代码只提到子类别列。然而,它产生了预期的结果

老实说,要实现你想要的目标,这似乎非常复杂和不直观。我已重新创建了您的表(感谢包含M代码!),并编写了以下计算表:

Ranked =
RANKX (
    FILTER (
        Table5,
        Table5[Category]
            = EARLIER ( Table5[Category] )
    ),
    Table5[Sales],
    ,
    ASC,
    DENSE
)
这将提供与结果列相同的输出。这里发生的事情是,我给它一个经过修改的表,基于一个FILTER语句,我将RANKX操作限制到该类别的所有行。Previous()指的是计算中向上一级的列(它针对每一行进行计算,使用Previous可以引用该行上的不同列)

如果这对您有帮助,请将其标记为解决方案:)

您的解决方案(第一个名为[Rank in category])将仅用作度量值,而不是计算列。它使用可视化表格生成的filtercontext

Rankx函数的第一个参数返回完整表中类别与可视化中选定值相同的部分(MAX('MyTable'[category]),因为MAX函数不受ALL函数的影响

然后,第二个参数(每行中的[sales])将与返回表中的[sales]值进行排序。您需要CALCULATE函数来使用FILTER函数创建的filtercontext

对于您的解决方案,这将是一种更干净、更短的方法:

Rank within category =
RANKX (
    ALLEXCEPT ( MyTable, MyTable[Category] ),
    CALCULATE ( SUM ( 'MyTable'[Sales] ) )
)

感谢您提交替代解决方案。由于前面的函数由于引入了变量而被认为是过时的,并且出于性能原因不推荐使用它,因此它启发了我找到变量的解决方案。但是你没有抓住我问题的重点。问题是我提出的解决方案如何产生预期的结果。我问枪是怎么发射的,你给了我一个鞠躬的回答。它看起来出人意料地有希望。然而,我讨厌函数ALLEXCEPT,因为它需要对所有可能影响结果的维度进行硬编码。如果向模型中添加尺寸标注,则其等效的ALL和VALUES更简单,尤其是在长期维护中。此外,ALLEXECPT会为所有项目生成结果,即使是那些没有销售的项目。请检查您是否有任何关于如何解决类似问题的提示您的更新包含一个未定义的度量值,因此很难说为什么这样做。它只是SalesMeasure=SUM(MyTable[sales])
Rank within category =
RANKX (
    ALLEXCEPT ( MyTable, MyTable[Category] ),
    CALCULATE ( SUM ( 'MyTable'[Sales] ) )
)