我正在寻找一种方法在中使用Microsoft PowerPivot 2010 ,该方法将允许我执行动态排名,该排名将根据所应用的过滤器和切片器值自动更新关联的排名值。

到目前为止,我看到的所有示例都使用Calculate()DAX函数,该函数通过All()函数覆盖PowerPivot表中的现有过滤器,这会导致忽略用户可以应用的预定义过滤器。

为了说明我的要求,请引用以下示例:

(PowerPivot窗口中的源数据:)

-------------------------------------------------------------------------------------
Claim Number | Claimant Number | Transaction Date |            Dollar Amount
------------------------------------------------------------------------------------
ABCD123456            4                1/1/2012                   $145.23
ABCD123456            4                8/1/2012                   $205.12
ABCD123456            4                9/1/2012                   $390.74
VDSF123455            2                3/5/2012                   $10.12
VDSF123455            2                9/5/2012                   $50.12
VDSF123455            2                12/9/2012                  $210.45
------------------------------------------------------------------------------------------

现在,我希望能够仅基于第一个交易日期显示每个 claim 编号和 claim 人编号的美元金额。我本质上希望只显示与每个 claim 号和 claim 人编号组相关的第一笔交易相关的美元。

我的想法是为每个[ claim 编号+ claim 编号]组创建一个动态等级,该组类似于“按-Row_Number()划分”功能。这样,每个包含等级值1的[ claim 号+ claim 人编号]组将代表与该值相关的FIRST交易。

但是,如果用户对结果数据透视表中的数据应用筛选器,则需要更改此等级值。

下面可以根据上面定义的样本数据对此进行说明:
----------------------------------------------------------------------------------------------
Claim Number | Claimant Number | Transaction Date |  Dollar Amount |  Rank |
---------------------------------------------------------------------------------------------
 ABCD123456             4                1/1/2012         $145.23        1
 ABCD123456             4                8/1/2012         $205.12        2
 ABCD123456             4                9/1/2012         $390.74        3
 VDSF123455             2                3/5/2012         $10.12         1
 VDSF123455             2                9/5/2012         $50.12         2
 VDSF123455             2               12/9/2012         $210.45        3
 ------------------------------------------------------------------------------------------------

现在,如果用户通过切片器或数据透视表或PowerPivot表本身中的筛选器下拉列表应用筛选器,但评估日期小于2012年2月1日,则排名值应自动更新并显示如下:

(已应用过滤器)
=============================================================================
Claim Number | Claimant Number | Transaction Date |  Dollar Amount |  Rank |
============================================================================
ABCD123456           4                 8/1/2012           $205.12       1
ABCD123456           4                 9/1/2012           $390.74       2
VDSF123455           2                 3/5/2012           $10.12        1
VDSF123455           2                 9/5/2012           $50.12        2
VDSF123455           2                12/9/2012          $210.45        3
===========================================================================

如您所见,基于与用户应用的过滤器相关联的隐藏有与 claim 编号ABCD123456关联的行中的一个,为第一个 claim 组自动更新了等级值。

然后,我想在PowerPivot表中创建一个附加度量,该度量将仅显示与排名值为1的交易相关的美元金额,如下所示:

(已应用过滤器,已添加新度量)
===============================================================================================
Claim Number | Claimant Number | Transaction Date |  Dollar Amount |  Rank | Opening Dollar Amt|
================================================================================================
ABCD123456          4                 8/1/2012          $205.12         1         $205.12
ABCD123456          4                 9/1/2012          $390.74         2
VDSF123455          2                 3/5/2012          $10.12          1         $50.12
VDSF123455          2                 9/5/2012          $50.12          2
VDSF123455          2                 12/9/2012         $210.45         3

================================================== ============================================

然后可以引用该数据创建相应的数据透视表,以使“开盘美元金额”度量仅表示与如上所述的每组第一笔交易相关的美元。

如果有人可以概述如何实现这一目标,我将不胜感激。

我认为动态排名方法可能是个不错的主意,但是如果有人有更好的主意来实现我的最终结果/目标,那就是简单地获取与第一笔交易“可见”相关的美元金额(基于所应用的任何用户)筛选器)每个组我都会对您可能采用的任何方法敞开心ear。

最佳答案

尽管这是一个写得很好的问题,您显然已经花了很多时间来制定公式,但是您应该read this about cross posting in forum。这与您完全同时在MSDN上发布的内容完全是重复的。我都认为这是一个体面的问题而回答。

首先,我创建了一个基本度量[金额]来对美元金额列求和。然后,我在RANKX()中使用它来创建以下内容:

[Rank] = RANKX(
         FILTER(
         ALLSELECTED(Table1),Table1[Claimant Number]=max(Table1[Claimant Number])
                   ),
         [Amount],
            ,1)

关键是要对[Amount]度量进行迭代的表-ALLSELECTED()仅使当前过滤器上下文中的内容发挥作用,而FILTER()中的表达式将表限制为当前的索偿号。

之后,根据[Rank]是否为1来返回[Amount]是一个简单的任务:
[Opening Balance] = if([Rank]=1,[Amount],BLANK())

希望这是有道理的,如果有帮助,我将工作发布在SkyDrive上。

雅各布

09-26 09:33