根据选定的切片器值更改 Power BI table 中的列排序顺序
Change column sort order in Power BI table based on selected slicer value
我有以下 result_table 作为数据源:
我想要实现的是拥有一个带有切片器的 table 视觉对象,用户可以在其中 select 学科,然后查看 table 按结果列排序的结果 -在第一位显示最好的结果。在我的例子中,这意味着:
- 如果 100m 是 selected,Result 列应该是 ASC 排序的,因为这个学科的结果类型是 TIME 意味着值越小,结果越好
- 如果 Long Jump 是 selected,结果列应该是 DESC 排序,因为这个学科的结果类型是 DISTANCE 意味着值越小,结果越好
我找到了一个非常相似的解决方案 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))
我有以下 result_table 作为数据源:
我想要实现的是拥有一个带有切片器的 table 视觉对象,用户可以在其中 select 学科,然后查看 table 按结果列排序的结果 -在第一位显示最好的结果。在我的例子中,这意味着:
- 如果 100m 是 selected,Result 列应该是 ASC 排序的,因为这个学科的结果类型是 TIME 意味着值越小,结果越好
- 如果 Long Jump 是 selected,结果列应该是 DESC 排序,因为这个学科的结果类型是 DISTANCE 意味着值越小,结果越好
我找到了一个非常相似的解决方案 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))