在PowerPivot / DAX中总结相关表的值

时间:2014-08-17 00:12:46

标签: excel powerpivot dax

说我有两张桌子。 attrsTable:

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

sizeTable:

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的基本概念。

2 个答案:

答案 0 :(得分:1)

您好Redstreet,

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

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

enter image description here

添加必要的措施(不需要计算列)要简单得多。我实际测试了两种情况:

1)为属性值文件大小创建简单的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。

This is the link to my source file in Excel (2010).

希望这有帮助。

答案 1 :(得分: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())

  3. 注意,所有这一切都假设您在创建枢轴时正在“拖入”来自'sizetable'的文件字段。