我有一个看起来像这样的powerpivot表...所有“事实”都在一个表中,其中Information列用于隔离:
Information | Year | Amount
Expense 2010 1000000
Units Sold 2010 50000
Expense 2011 2000000
Units Sold 2011 125000
我希望能够计算各种比率。这似乎是一个直接的需求,但我无法弄明白或在网上找到解决方案。
例如......
实际上还有更多维度(地区,位置,月份等)和其他信息类型(人数,平方英尺等),但只有三个或四个分母,所以我希望解决方案能够扩展
我怎么能在Powerpivot中做到这一点?我可以使用(例如)CALCULATE(SUM(fact [amount]),fact [information] =“Units Sold”))来计算分母,但不能将该分母应用于所有分子。
X X X X
根据下面提供的答案添加跟进...
问题#1: 下面提供的解决方案在我查看总费用时有效,但实际上费用行将是多行(工资,福利,租金等),我需要能够计算每个单位已售出的数量。解决方案似乎不允许这样做。
问题#2: 事实表目前有四种不同的信息类型......费用(如上所述),销售单位,人数和平方英尺。我希望能够做到的是每次售出的费用,每单位售出的人数等等。换句话说,一个分母可以应用于所有行,然后可以很容易地在数据透视表中求和。该解决方案采取的不是销售单位的所有内容,将其相加然后除以销售单位...混合费用,人数和平方英尺。
再次感谢您的帮助。
答案 0 :(得分:1)
SumAmt:= SUM( FactTable[Amount] )
UnitsSoldDenominator:=
DIVIDE(
CALCULATE(
[SumAmt]
,FILTER(
VALUES( FactTable[Information] )
,FactTable[Information] <> "Units Sold"
)
)
,CALCULATE(
[SumAmt]
,FactTable[Information] = "Units Sold"
)
)
这将提供您想要的行为。
值得花一些时间来解释为什么我们的CALCULATE()的过滤器参数在分子和分母中是不同的。
带有文字谓词的CALCULATE(),就像我们在DIVIDE()的第二个参数中看到的那样被隐式重写为以下内容:
CALCULATE(
[SumAmt]
,FILTER(
ALL( FactTable[Information] )
,FactTable[Information] = "Units Sold"
)
)
FILTER()简单地迭代在参数1中传递给它的表,并返回该表中的参数为2的行返回true。
在那里隐含ALL(),然后没有从数据透视表中保留上下文。
VALUES()计算过滤器上下文中的表或列引用。因此,当我们评估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窗口的管理关系对话框中。我看到了与我在针对DimInformation [信息]编写的新版本中针对FactTable [信息]提供的原始度量相同的行为。
如果你的型号配置相同,请告诉我,你无法重现这个。
编辑2用于层次结构
UnitsSoldDenominator:=DIVIDE(
CALCULATE(
[SumAmt]
,FILTER(
DimInformation
,DimInformation[Information] <> "Units Sold"
)
)
,CALCULATE(
[SumAmt]
,ALL( DimInformation )
,DimInformation[Information] = "Units Sold"
)
)
这里我们在分母中添加了对ALL(DimInformation)的调用。这是因为我们将在DimInformation [InformationGroup]和DimInformation [Information]的数据透视表中包含过滤器上下文。 CALCULATE()中的过滤谓词DimInformation [Information] =“Units Sold”隐含地剥离了DimInformation [Information]上存在的过滤器上下文,但是当我们将DimInformation [InformationGroup]放入数据透视表时,它提供了一组新的过滤器上下文(所有过滤器上下文都以逻辑方式计算)。
因此我们正在寻找(在下图中的示例中)DimInformation [InformationGroup] =“Expense”(这是由数据透视表提供的上下文)&amp;&amp; DimInformation [信息] =“出售单位”。这在我们的数据中是不可能的,因此分母将是空白的。
因此,我们从所有DimInformation中剥离过滤器上下文,然后评估我们的文字谓词。