根据选定的切片器值更改 Power BI table 中的列排序顺序

Change column sort order in Power BI table based on selected slicer value

我有以下 result_table 作为数据源:

我想要实现的是拥有一个带有切片器的 table 视觉对象,用户可以在其中 select 学科,然后查看 table 按结果列排序的结果 -在第一位显示最好的结果。在我的例子中,这意味着:

我找到了一个非常相似的解决方案 here,但有一个问题:一个一个地定义所有切片器值效率不高 - 我有很多规程。我宁愿考虑使用 disc_table,其中为每个学科定义了结果类型,并在配置开关时使用此信息。

但是我真的不知道应该如何在度量中对此进行编码,或者这是否是最好的解决方案。

感谢您的所有建议!

更新:我刚刚注意到我错过了这里的一个重要部分。 result_table 有一个隐藏列,其中包含转换为毫秒的时间结果和转换为厘米的距离结果。这是因为有些学科的结果格式不同,例如对于 1000 米,它看起来像这样:2:55,55。所以结果列是文本数据类型,但 table 实际上是由 ConvertedResult 列排序的,并且隐藏在视觉上(零宽度)

I have many disciplines. I'm rather thinking of using a reference table where the result type is defined for each discipline and using this information while configuring the switch.

是的。你真的不需要从切片器的角度考虑这个问题。只需编写一个生成正确排序的度量。使用 SELECTEDVALUE 函数引用学科 table.

的当前值

这最终比我想象的要复杂一些。我想你想在 Order By Column 上构建。但是你必须将结果切换为键入文本,然后隐藏“ResultSort”并将其设置为结果的“按列排序”。

学科:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjQwyFXSUQrJzE1VitWJVvLJz0tX8CrNLQAKumQWlyTmJQMlYgE=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Dicipline = _t, ResultType = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Dicipline", type text}, {"ResultType", type text}})
in
    #"Changed Type"

和结果:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjQwyFXSUQoNdgSSlnqWZkqxOtFKPvl56QpepbkFcClTMwOwDFS9u1MQWL2FOYZ6iJSJEVB9LAA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Dicipline = _t, Country = _t, Result = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Dicipline", type text}, {"Country", type text}, {"Result", type number}}),
    #"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Dicipline"}, Diciplines, {"Dicipline"}, "Diciplines", JoinKind.LeftOuter),
    #"Expanded Diciplines" = Table.ExpandTableColumn(#"Merged Queries", "Diciplines", {"ResultType"}, {"ResultType"}),
    #"Added Conditional Column" = Table.AddColumn(#"Expanded Diciplines", "ResultDirection", each if [ResultType] = "Time" then -1 else if [ResultType] = "Distance" then 1 else null, type number),
    #"Added Custom" = Table.AddColumn(#"Added Conditional Column", "ResultSort", each 1000000*[Result]*[ResultDirection], Int64.Type),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"ResultType", "ResultDirection"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Removed Columns",{{"Result", type text}})
in
    #"Changed Type1"

DAX

如果你有以下table

| Discipline | Country | Result |
|------------|---------|--------|
| 100m       | USA     | 9.69   |
| LJ         | GBR     | 560    |
| 100m       | GBR     | 9.87   |
| LJ         | USA     | 420    |

并且您有一个 Discipline 的切片器,您希望测量值在 LJ 上按 ASC 排序,在 100m 上按 DESC 排序。

您可以通过关注

_sum = SUM('fact'[Result])
_rank = 
SWITCH (
    TRUE (),
    SELECTEDVALUE ( 'fact'[Discipline] ) = "LJ", RANKX ( ALL ( 'fact'[Country] ), [_sum],, ASC ),
    SELECTEDVALUE ( 'fact'[Discipline] ) = "100m", RANKX ( ALL ( 'fact'[Country] ), [_sum],, DESC )
)

完成后,将所有度量带到可视化并按 _rank 排序,然后 Sort Ascending

如果您为此求助于 DAX,您需要在 SWITCH 中为每个学科编写单独的语句,并在相应的 RANKX[= 中定义所需的排名排序顺序23=]

我终于弄明白了,这里我使用的衡量标准与参考 table 一起称为“纪律”。

Ranking = 
IF (
  LOOKUPVALUE(Disciplines[ResultType], Disciplines[Discipline],
    SELECTEDVALUE(Results[Discipline]))="T",RANKX(ALLSELECTED(Results),CALCULATE(SUM(Results[ConvertedResult])),,DESC),RANKX(ALLSELECTED(Results),CALCULATE(SUM(Results[ConvertedResult])),,ASC))