Powerpivot - 从单个事实表创建比率

时间:2015-12-22 20:47:47

标签: excel math dax powerpivot

我有一个看起来像这样的powerpivot表...所有“事实”都在一个表中,其中Information列用于隔离:

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

我希望能够计算各种比率。这似乎是一个直接的需求,但我无法弄明白或在网上找到解决方案。

例如......

  • 2010年,2011年或合并销售的费用/单位(基于Excel中应用的过滤器)
  • ..... 2010 = 1000000/50000 = 20; 2011 = 2000000/125000 = 16;所有时间= 3000000/175000 = 17.14 ETC。

实际上还有更多维度(地区,位置,月份等)和其他信息类型(人数,平方英尺等),但只有三个或四个分母,所以我希望解决方案能够扩展

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

X X X X

根据下面提供的答案添加跟进...

问题#1: 下面提供的解决方案在我查看总费用时有效,但实际上费用行将是多行(工资,福利,租金等),我需要能够计算每个单位已售出的数量。解决方案似乎不允许这样做。

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

再次感谢您的帮助。

1 个答案:

答案 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])时,我们只返回数据透视表中上下文中的值。在任何一年中,我们都会收回当年存在的每个标签,即我们获得每个标签的总计。在“售出单位”级别,我们什么都没有回来,因为我们正在过滤掉它。

这是一个数据透视表的图像,其中包含基于您的示例数据和此度量的预期行为。

enter image description here

编辑尺寸表

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 [信息]提供的原始度量相同的行为。

如果你的型号配置相同,请告诉我,你无法重现这个。

enter image description here

编辑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中剥离过滤器上下文,然后评估我们的文字谓词。

enter image description here