我正在寻找一种方法在中使用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上。
雅各布