【问题标题】:Using FILTER with VALUES (multiple rows error)将 FILTER 与 VALUES 一起使用(多行错误)
【发布时间】:2021-02-16 05:58:39
【问题描述】:

我正在为《DAX 权威指南》一书提供的 Contoso 数据库学习 DAX。

我正在尝试了解过滤器上下文并且我写了这个度量:

CountColor:= COUNT ( 'Product'[Color] )

我将它放入数据透视表中,将 'Product'[Color] 添加到行部分,结果如下:

Row Labels CountColor
Azure 14
Black 602
Blue 77
... ...

这表明每一行中的过滤器上下文是由该行的颜色定义的。

当我编写以下度量时,我预计 VALUES 仅返回数据透视表行中当前可用的一种颜色的唯一值,并且它会自动转换为标量值:

CountColorValues:= CALCULATE (
                     COUNT ( 'Product'[Color] ),
                     FILTER ( 'Product',
                              'Product'[Color] = VALUES ( 'Product'[Color] )
                     )
                   )

但是把这个度量放到同一张表上,我得到了错误: “度量 'Product'[CountColorValues] 中的计算错误:提供了一个包含多个值的表,而预期只有一个值。”

我创建了另一个度量来测试 VALUES 是否真的返回单个值:

CountrowsValues:= COUNTROWS ( 
                     CALCULATETABLE ( VALUES ( 'Product'[Color] )
                     )
                  )

结果:

Row Labels CountrowsValues
Azure 1
Black 1
Blue 1
... ...

当我试图让 VALUES 在 FILTER 中工作时,我错过了什么?

【问题讨论】:

  • 您收到此错误,因为您试图将标量值与表进行比较,因为 VALUES 返回表,而不管它返回多少行。使用 IN 运算符或 CONTAINSROWS 函数。
  • 据我所知,如果一个表有一列一行,如果在表达式中使用,DAX会自动将其转换为标量值。 CountColorTableToScalar:=CALCULATE(COUNT('Product'[Color]), FILTER('Product','Product'[Color]=SUMMARIZE(TOPN(1,'Product'),'Product'[Color]))) 在这个测量 SUMMARIZE 的结果被传递给 FILTER 表达式,其中结果是有意为一列一行的表。
  • 当然,但是如果您总是期望一个值,为什么首先要使用 Values?
  • 你能否给我指出一个文档,该文档讨论了表到标量的这种隐式转换?我在这里没找到:docs.microsoft.com/en-us/power-bi/connect-data/…
  • 在这里你会发现在语法要求下提到了转换:docs.microsoft.com/hu-hu/dax/dax-syntax-reference

标签: excel powerbi dax powerpivot


【解决方案1】:

在这种情况下,VALUES 获得一个不同的项目列表,因此如下所示:

CountColorValues:= CALCULATE (
                     COUNT ( 'Product'[Color] ),
                     FILTER ( 'Product',
                              'Product'[Color] = VALUES ( 'Product'[Color] )
                     )
                   )

'Product'[Color] 试图等于 {'Azure', 'Black' , 'Blue'} 的列表,因此实际上你试图使 'Azure' 的行等于不同的价值观

为此,需要将其更改为 IN,是列表中的 [color] 值,不等于列表。

 CountColorValues:= CALCULATE (
                         COUNT ( 'Product'[Color] ),
                         FILTER ( 'Product',
                                  'Product'[Color] IN VALUES ( 'Product'[Color] )
                         )
                       )

【讨论】:

  • 我明白了,但是在 FILTER 中,VALUES 不受过滤器上下文影响,但在 CALCULATETABLE 中是什么原因?如果我使用 IN,它可以让我传递一个包含多行的表,因此它可以解决多行的错误,但我的目标是理解为什么 VALUES 如果过滤器上下文有一个过滤器到单一颜色,则返回所有颜色而不是一个颜色价值。
【解决方案2】:

该问题可能是由数据透视表的总计引起的。 那里的上下文不同,没有颜色过滤器,因此 VALUES 返回每种颜色,因此该度量给出了提到的多行错误。

关闭数据透视表上的总计并不能解决问题,错误不断出现。

结论是,即使您愿意抑制它,您也必须编写与 Grand Total 兼容的度量。

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多