0

假设我有两张桌子。属性表:

file | attribute | value
------------------------
A    | xdim      | 5
A    | ydim      | 6
B    | xdim      | 7
B    | ydim      | 3
B    | zdim      | 2
C    | xdim      | 1
C    | ydim      | 7

尺寸表:

file | size
-----------
A    | 17
B    | 23
C    | 34

我通过“文件”字段关联了这些表。我想要 attrsTable 中的 PowerPivot 度量,其计算使用大小。例如,假设我想要 A、B、C 中的每一个的 xdim+ydim/size。计算将是:

A: (5+6)/17
B: (7+3)/23
C: (1+7)/34

我希望该度量足够通用,以便以后可以使用切片器按文件或属性切片。我该如何做到这一点?

我试过了:

dimPerSize := CALCULATE([value]/SUM(sizeTable[size])) # Calculates 0
dimPerSize := CALCULATE([value]/SUM(RELATED(sizeTable[size]))) # Produces an error

知道我做错了什么吗?我可能在这里遗漏了一些关于如何将 DAX 与关系一起使用的基本概念。

4

2 回答 2

1

嗨红街,

从您的解决方案和 Jacob 提出的解决方案中退后一步,我认为创建另一个汇总所有计算的表可能会很有用(特别是考虑到您可能有超过 2 个具有文件特定属性的表)。

所以我又创建了一个包含(仅)唯一文件名的表,因此可以通过这种方式可视化关系:

在此处输入图像描述

添加必要的措施要简单得多(不需要计算列)。我实际上已经测试了 2 个场景:

1)为Attribute ValueFile Size创建简单的 SUM 度量。然后划分这两个措施并完成工作:-)。

2)使用 SUMX 函数来获得更通用的解决方案。那么DimPerSize计算的最终公式可能如下所示:

=DIVIDE(
   SUMX(DISTINCT(fileTable[file]),[Sum of AttrValue]), 
   SUMX(DISTINCT(fileTable[file]),[Sum of FileSize]), 
   BLANK()
)

[AttrValue 之和] 为:

=SUM(attrsTable[value])

FileSize 的总和为:

=SUM(sizeTable[size])

这工作得非常好,即使 SUMX 在这两种情况下都会遍历给定文件名的所有实例。因此,对于文件B,它还使用zdim进行计算(如果需要将其过滤掉,则使用简单的计算/过滤器组合)。在文件大小的情况下,我也使用 SUMX,即使它并不是真正需要的,因为该表只包含每个文件名的 1 条记录。如果有 2 个实例,则根据所需的结果使用 SUMX 或 AVERAGEX。

这是我在 Excel (2010) 中的源文件的链接。

希望这可以帮助。

于 2014-08-18T17:44:34.313 回答
0

您看起来对关系的概念很好,但就 CALCULATE() 而言,无论是在结构方面还是在您不能简单地使用“裸”数字列的事实方面,您都没有走上正确的轨道,它们需要是以某种方式包装。

您想要的方法是正确的,因为一旦您运行了一个简单版本的东西,您将能够在任何相关维度上对其进行切片和切块。

最佳实践可能是使用几种措施来建立它:

[xdim] = CALCULATE(SUM('attrstable'[value]), 'attrstable'[attribute] = "xdim")
[ydim] = CALCULATE(SUM('attrstable'[value]), 'attrstable'[attribute] = "ydim")
[dimPerSize] = ([xdim] + [ydim]) / VALUES('sizeTable'[size])

但取决于您的数据透视表的具体设置方式,这也可能会引发错误,因为它会尝试使用总计中的整个“大小”列。有两种主要的策略来处理这个问题:

  1. 使用诸如 SUX() 或 AVERAGEX() 之类的“迭代”公式对“文件”字段进行单独迭代,然后将总数相加或求平均值,例如

    [ItdimPerSize] = AVERAGEX(VALUES('sizeTable'[file]), [dimPerSize])

    根据您要使用的数学,您可能会发现产生一个有用的平均值,您需要使用 SUMX,但除以案例数,即 COUNTROWS('sizeTable'[file])。

  2. 您可能会认为总数无关紧要,只需引入一个错误处理元素,使它们变为空白,例如

    [NtdimPerSize] = IF(HASONEVALUE('sizeTable'[file]),[dimPerSize],BLANK())

注意,所有这些都假设当您创建数据透视表时,您正在从“sizetable”中“拖入”文件字段。

于 2014-08-17T08:11:22.630 回答