Powerpivot – 从单个事实表创build比率

我有一个powerpivot表,看起来像这样…所有“事实”都在一个单独的表中,用于分隔信息列:

Information | Year | Amount Expense 2010 1000000 Units Sold 2010 50000 Expense 2011 2000000 Units Sold 2011 125000 

我希望能够计算各种比率。 这似乎是一个直截了当的需求,但我一直无法find解决或在网上find解决scheme。

例如…

  • 2010年,2011年或综合销售的费用/单位(基于在Excel中应用的filter)
  • ….. 2010 = 1000000/50000 = 20; 2011 = 2000000/125000 = 16; 所有时间= 3000000/175000 = 17.14等。

实际上还有更多的维度(地域,地点,月份等)和其他信息types(人数,平方英尺等),但只有三四个分母,所以我希望这个解决scheme可以扩展。

我怎么能在Powerpivot中做到这一点? 我可以使用(例如)CALCULATE(SUM(fact [amount]),fact [information] =“Units Sold”))来计算分母,但不能得到应用于所有分子的分母。

x x x x

根据下面提供的答案添加后续…

问题1:下面提供的解决scheme适用于总费用,但实际上费用线是多行(薪水,福利,租金等),我需要能够计算每个单位出售。 解决scheme似乎不允许这样做。

问题#2:事实表目前有四种不同的信息types…费用(如上所述分解),销售量,总人数和平方英尺。 我希望能够做到的是每个出售的费用,每个出售的单位的总人数等。换句话说,可以应用于所有行的分母,然后可以容易地在数据透视表中求和。 解决scheme采取一切不是单位出售,总结它,然后除以销售单位…混合费用,总人数和平方英尺。

再次感谢您的帮助。

 SumAmt:= SUM( FactTable[Amount] ) UnitsSoldDenominator:= DIVIDE( CALCULATE( [SumAmt] ,FILTER( VALUES( FactTable[Information] ) ,FactTable[Information] <> "Units Sold" ) ) ,CALCULATE( [SumAmt] ,FactTable[Information] = "Units Sold" ) ) 

这会给你想要的行为。

值得花一些时间来解释为什么我们的CALCULATE()的filter参数在分子和分母中是不同的。

CALCULATE()与一个文字谓词,就像我们在DIVIDE()的第二个参数中看到的一样,被隐式地重写为:

 CALCULATE( [SumAmt] ,FILTER( ALL( FactTable[Information] ) ,FactTable[Information] = "Units Sold" ) ) 

FILTER()只是遍历在参数1中传递给它的表,并返回表中的行,其中参数2返回true。

使用隐含的ALL(),那么数据透视表就没有保存上下文了。

VALUES()在filter上下文中评估表或列引用。 因此,当我们计算VALUES(FactTable [Information])时,我们只返回数据透视表中上下文中的值。 在任何特定的年份,我们都会收回当年存在的每一个标签。 在“单位销售”级别,我们没有收回任何东西,因为我们正在过滤掉。

以下是基于您的示例数据和此度量的预期行为的数据透视表映像。

在这里输入图像说明

编辑维表

 UnitsSoldDenominator:=DIVIDE( CALCULATE( [SumAmt] ,FILTER( VALUES( DimInformation[Information] ) ,DimInformation[Information] <> "Units Sold" ) ) ,CALCULATE( [SumAmt] ,DimInformation[Information] = "Units Sold" ) ) 

这取决于在FactTable和DimInformation之间定义的活动关系。 我已经定义了我的数字[InformationKey]。

下面的图片包含了基于您在原始问题中提供的示例数据,以及从相同的推断出的模拟维度。 数据透视表与扩展的字段列表一起显示。 我的模型中的关系显示在Power Pivot窗口的pipe理关系对话框中。 我看到了与我写的针对FactTable [Information]提供的原始度量和用DimInformation [Information]写的新版本相同的行为。

请让我知道,如果你的模型configuration相同,你无法重现这一点。

在这里输入图像说明

编辑2的层次结构

 UnitsSoldDenominator:=DIVIDE( CALCULATE( [SumAmt] ,FILTER( DimInformation ,DimInformation[Information] <> "Units Sold" ) ) ,CALCULATE( [SumAmt] ,ALL( DimInformation ) ,DimInformation[Information] = "Units Sold" ) ) 

在这里,我们在分母中添加了对所有(DimInformation)的调用。 这是因为我们将在DimInformation [InformationGroup]和DimInformation [Information]的数据透视表中过滤上下文。 DimInformation [Information] =“Units Sold”中的filter谓词隐含地去除DimInformation [Information]上存在的filter上下文,但是当我们将DimInformation [InformationGroup]放入数据透视表中时,会提供一组新的filter上下文(所有filter上下文都是在逻辑中计算的)。

因此我们正在寻找DimInformation [InformationGroup] =“Expense”(这是由数据透视表提供的上下文)&& DimInformation [Information] =“Units Sold”。 这在我们的数据中是不可能的,所以分母是空白的。

因此,我们从DimInformation中去除filter上下文,然后评估我们的文字谓词。

在这里输入图像说明

Interesting Posts