【问题标题】:DAX How to return a table based on a condition - workaround for IF to return a tableDAX 如何根据条件返回表 - IF 返回表的解决方法
【发布时间】:2023-02-10 07:07:08
【问题描述】:

如何根据条件返回 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 限制,我们就可以非常有用地应用它。想象一下,我们有一个切片器可以在 [Quantity]、[Value]、[Cost] 中选择一个度量。我们还有另一个切片器来选择过滤器集。我们可以用一个措施来处理它:

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


    【解决方案1】:

    在这里,一个切片器的解决方案可以让用户选择不同的措施.如何选择不同的数据表,也是我很好奇的事情:)

    根据上面的表 Table 和两个措施 M_QuantityM_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 显示所选度量的卡片。然后,它看起来像这样:

      祝你好运!期待其他网友对你问题第二部分学习如何切换不同数据表的解答!

    【讨论】:

    • 我在我的问题中提到了这种方法作为不令人满意的解决方案:IF(Slicer_Selection_Condition, [M1], [M2] )这不是有条件返回表的解决方法。尽管如此,还是感谢您的尝试。
    【解决方案2】:

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

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

    2. DAX 中允许使用任意形状的过滤器,但显然不是有条件的。它似乎有条件地将过滤表传递给CALCULATE,通过IFSWITCH抛出错误。在 dax.do 中,此错误指向缺少列声明,但这对于在条件构造之外传递的过滤表来说不需要。我怀疑这是由于数据沿袭没有通过这样的构造来保存。

    【讨论】:

    • 我希望有条件地返回表作为 DAX 度量中的过滤器。与您在回答中提到的故事完全不同。你写的是真的,但与我的问题无关。您可以拥有动态计算的 DAX 表,有时存储在 VAR 中以用于度量。请在我的问题中检查所需的测量模式。
    • 你是对的——我太仓促了。我再看看。
    猜你喜欢
    • 2014-11-28
    • 2023-01-24
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2019-03-11
    • 2015-03-29
    相关资源
    最近更新 更多