如何根据条件返回DAX表? IF 函数无法返回 DAX 中的表。
IF( 1=1, table_1, table_2 )
它会引发错误: 表达式引用多个列。多列无法转换为标量值。
我想使用切片器在多个表之间进行选择,该表稍后可用于 CALCULATE 中的交替动态过滤器上下文。
CALCULATE( [Measure],
IF( Condition,
table_1,
table_2
)
)
为了使问题更具挑战性,我希望 table_1 和 table_2 有不同的列集。所以 UNION 和 FILTER 函数的组合是行不通的。
UNION(
FILTER( table_1, condition ),
FILTER( table_2, NOT condition)
)
作为一种可能的方法,我们可能会根据切片器的选择来选择一个度量:
IF( Slicer_Selection_Condition,
[M1], // Measure with filter set 1
[M2] // Measure with filter set 2
)
但我不想走这条路,因为它会增加每个切片器组合所需的措施数量。
如果我们能够超越 IF 限制,我们就可以非常有用地应用它。想象一下,我们有一个切片器可以在 [数量]、[价值]、[成本] 中选择一个度量。我们还有另一个切片器来选择过滤器组。我们可以用一种措施来处理它:
CALCULATE(
SWITCH( Measure_Slicer, 1, [Quantity], 2, [Value], [Cost] ), // measure choice
SWITCH( Filter_Slicer, 1, table_1, 2, table_2, table_3 ) // filter choice
)
这是重现问题的表格:
Table =
DATATABLE (
"Color", STRING,
"Shape", STRING,
"Quantity", INTEGER,
"Value", INTEGER,
{
{ "Red" , "Circle" , 1, 10 },
{ "Red" , "Triangle", 1, 10 },
{ "Blue" , "Circle" , 1, 10 },
{ "Blue" , "Triangle", 1, 10 },
{ "Yellow", "Square" , 1, 10 }
}
)
及措施:
M_Quantity = SUM( 'Table'[Quantity] )
M_Value = SUM( 'Table'[Value] )
Desired Measure =
VAR Measure_Slicer = 1 // Either 1 OR 2
VAR Filter_Slicer = 1 // Either 1 OR 2
VAR table_1 = SUMMARIZE( 'Table', 'Table'[Color] )
VAR table_2 = SUMMARIZE( 'Table', 'Table'[Color], 'Table'[Shape] )
RETURN
CALCULATE(
SWITCH( Measure_Slicer, 1, [M_Quantity], [M_Value]), // Measure choice
SWITCH( Filter_Slicer, 1, table_1 , table_2 ) // Filter choice
)
我遇到了类似的问题,我认为解决方案是可能的。最终我没有对其进行太多测试,但我分享这个概念,以防您发现它有用。 这个想法是,过滤表中的过滤条件必须与一个布尔因子组合,该布尔因子可以使两个过滤表之一有效(另一个为空)。
VAR __my_boolean = Filter_Slicer = 1 //__my_boolean is true when the Filter_Slicer = 1, otherwise __my_boolean is false
VAR __filter_A =
FILTER (
table,
table_1 && __my_boolean
) //this filter table will only contain data when __my_boolean is true
VAR __filter_B =
FILTER (
table,
table_2 && NOT ( __my_boolean )
) //this filter table will only contain data when __my_boolean is false
RETURN
CALCULATETABLE (
table,
UNION (
__filter_A,
__filter_B
)
)
正如您所见,这与您提到的“UNION 和 FILTER 函数的组合行不通”类似,但它已更进一步将不同的过滤表(table_1 和 table_2)合并为一个统一的集合列。如果您觉得有用,请留下一个签名:)。谢谢。
这里是一个切片器的解决方案,它允许用户在不同的测量之间进行选择。如何选择不同的数据表,也是我很好奇的事情:)
根据上面的表格
Table
以及两个措施M_Quantity
和M_Value
,您唯一需要添加的是:
包含选择可能性的表格:
choice_measures =
DATATABLE (
"Id", INTEGER,
"Use", STRING,
{
{ 1, "Quantity"},
{ 2, "Value" }
}
)
还有一项措施:
M_Measure =
VAR MySelection = SELECTEDVALUE(choice_measures[Id], "Show all") RETURN
SWITCH(
TRUE(),
MySelection = 1, [M_Quantity],
MySelection = 2, [M_Value],
""
)
choice_measures[Id]
的切片器,用户可以在两个度量之间进行选择,最后,通过M_Measure
显示所选度量的卡片。然后,它会看起来像这样:
祝你好运!期待其他用户对您问题的第二部分的回答,学习如何在不同的数据表之间切换!
经过大量测试,我得出以下结论:
使用
SWITCH
或类似方式声明要在 CALCULATE
内使用的度量不是有效的语法。对于这些类型的应用程序,存在计算组,您可以在其中使用占位符 SELECTEDMEASURE
对测量进行编码。
DAX 中允许使用任意形状的过滤器,但显然不是有条件的。似乎通过
CALCULATE
或 IF
有条件地将过滤器表传递给 SWITCH
会引发错误。在 dax.do 中,此错误指出缺少列声明,但对于在条件构造之外传递的过滤表来说不需要这样做。我怀疑这是由于数据沿袭没有通过这样的构造得到保留。
有时我们需要详细行exp来基于双击返回差异表,所以感谢您在差异表具有相同列数时的联合和过滤变体,但是对于差异列数,您对此变体有何看法?
EVALUATE
VAR x =
{ (
"test",
( IF( 1 = 1, 1, 0 ) ) -- change with measure? union & filter
)
}
VAR y =
{
("test", 1, "C1", 100),
("test", 1, "C1", 200),
("test", 1, "C1", 300)
} -- maybe addcolumns() to the real table
RETURN
NATURALINNERJOIN(x,y)