类别

时间:2019-11-29 10:20:57

标签: powerbi dax

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

enter image description here

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcisqzSwpVtJRSiwoyEkF0oZgHKuDJJWUmAeEQIYJEBuhypXn56QlpRYVVQLZpkBsjCqdnAGVMwNrB8mFpaanliQm5aSC5AvySxJL8lGsRZFPTiwqyi8BWwuzGkU+Py8zPw9Im0OsjgUA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Category = _t, Subcategory = _t, Sales = _t, Results = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Category", type text}, {"Subcategory", type text}, {"Sales", Int64.Type}, {"Results", Int64.Type}})
in
    #"Changed Type"

我漫游了提示there。根据此处显示的模式,我可以编写以下代码:

Rank within category =
RANKX (
    FILTER (
        ALL (
            'MyTable'[Category],
            'MyTable'[Subcategory]
        ),
        'MyTable'[Category]
            = MAX ( 'MyTable'[Category] )
    ),
    CALCULATE (
        SUM ( 'MyTable'[Sales] )
    )
)

上面的代码产生了预期的结果,但是我不知道它是如何工作的。您能说明一下吗?

更新。

我发现here是另一种简单的方法,几乎​​没有几行内容,但是再次讲,它的工作逻辑仍然令我感到困惑。你能解释一下吗?

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
        )
    )

此代码的神秘之处在于它如何知道类别?代码仅提及子类别列。然而,它产生了预期的结果。

2 个答案:

答案 0 :(得分:1)

说实话,完成您想要的工作似乎很复杂且不直观。我已经重新创建了您的表(感谢包含M代码!)并编写了以下计算出的表:

Ranked =
RANKX (
    FILTER (
        Table5,
        Table5[Category]
            = EARLIER ( Table5[Category] )
    ),
    Table5[Sales],
    ,
    ASC,
    DENSE
)

这将提供与“结果”列相同的输出。这里的障碍是,我根据FILTER语句为它提供了一个经过修改的表,其中我将RANKX操作限制为该类别的所有行。 EARLIER()指的是计算中上一级的列(将对每一行进行评估,使用EARLIER可以在该行上引用不同的列)。

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

答案 1 :(得分:1)

您的解决方案(第一个名为[等级内的等级]的解决方案)将仅作为度量,而不作为计算列。它使用表visual生成的filtercontext。

Ranxx函数的第一个参数返回完整表的该部分,其中类别与可视化中的选定值相同(MAX('MyTable'[Category])),因为MAX函数不受以下影响ALL功能。

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

这将是一种更清洁,更短的解决方案:

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