6

我正在寻找一种在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
------------------------------------------------------------------------------------------

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

我的思考过程是为每个 [索赔编号 + 索赔人编号] 组创建一个动态排名,类似于“partition by - Row_Number()”函数。这样,每个包含排名值为 1 的 [索赔编号 + 索赔人编号] 组将代表与该值相关的第一个交易。

但是,如果用户对生成的数据透视表中的数据应用过滤器,我将需要更改此排名值。

这可以根据上面定义的示例数据在下面进行说明:

----------------------------------------------------------------------------------------------
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
===========================================================================

如您所见,根据用户应用的过滤器,基于与索赔编号 ABCD123456 相关联的行之一被隐藏,第一个索赔组的排名值自动更新。

然后,我想在 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

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

然后可以参考该数据创建相应的数据透视表,以便“Opening Dollar Amt”度量仅代表与上述每组第一个交易相关的美元。

如果有人能概述如何实现这一点,我将不胜感激。

我认为动态排名方法可能是一个好主意,但如果有人有更好的想法来实现我的最终结果/目标,即简单地获得与第一笔交易“可见”相关的美元金额(基于任何应用的用户过滤器)每组我会对你可能有的任何方法持开放态度。

4

1 回答 1

3

尽管这是一个写得很好的问题,您显然已经花时间来制定,但您应该阅读有关在 forums 中交叉发布的内容。这与您同时在 MSDN 上发布的内容明显重复。我已经回答了两个都认为这是一个体面的问题。

首先,我创建了一个基本度量 [Amount] 来汇总美元金额列。然后我在 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上。

雅各布

于 2013-04-01T23:10:27.283 回答