DAX 如何根据条件返回表 - IF 返回表的解决方法

问题描述 投票:0回答:4

如何根据条件返回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
)
powerbi dax
4个回答
2
投票

我遇到了类似的问题,我认为解决方案是可能的。最终我没有对其进行太多测试,但我分享这个概念,以防您发现它有用。 这个想法是,过滤表中的过滤条件必须与一个布尔因子组合,该布尔因子可以使两个过滤表之一有效(另一个为空)。

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)合并为一个统一的集合列。如果您觉得有用,请留下一个签名:)。谢谢。


0
投票

这里是一个切片器的解决方案,它允许用户在不同的测量之间进行选择。如何选择不同的数据表,也是我很好奇的事情:)

根据上面的表格

Table
以及两个措施
M_Quantity
M_Value
,您唯一需要添加的是:

  1. 包含选择可能性的表格:

    choice_measures = 
    DATATABLE (
        "Id", INTEGER,
        "Use", STRING,
        {
          { 1, "Quantity"},
          { 2, "Value"   }
        }
    )
    
  2. 还有一项措施:

    M_Measure = 
    VAR MySelection = SELECTEDVALUE(choice_measures[Id], "Show all") RETURN 
    SWITCH(
        TRUE(), 
        MySelection = 1, [M_Quantity], 
        MySelection = 2, [M_Value], 
        ""
    )
    
  3. choice_measures[Id]
    的切片器,用户可以在两个度量之间进行选择,最后,通过
    M_Measure
    显示所选度量的卡片。然后,它会看起来像这样:

enter image description here

祝你好运!期待其他用户对您问题的第二部分的回答,学习如何在不同的数据表之间切换!


0
投票

经过大量测试,我得出以下结论:

  1. 使用

    SWITCH
    或类似方式声明要在
    CALCULATE
    内使用的度量不是有效的语法。对于这些类型的应用程序,存在计算组,您可以在其中使用占位符
    SELECTEDMEASURE
    对测量进行编码。

  2. DAX 中允许使用任意形状的过滤器,但显然不是有条件的。似乎通过

    CALCULATE
    IF
    有条件地将过滤器表传递给
    SWITCH
    会引发错误。在 dax.do 中,此错误指出缺少列声明,但对于在条件构造之外传递的过滤表来说不需要这样做。我怀疑这是由于数据沿袭没有通过这样的构造得到保留。


0
投票

有时我们需要详细行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)
© www.soinside.com 2019 - 2024. All rights reserved.