[英]MDX: How to access currently selected dimension members?
我正在尝试在MDX
中创建一个度量来获取所选期间的第一天(我有一个 YMD 日期维度)。 我正在使用EXISTING
function 来获取选定的成员。 如果我在 Excel pivot 表过滤器中只使用 select 一维成员,它工作正常。 但是,一旦我 select 多个成员(例如:2012 和 2013 一起), EXISTING
的 function 就无法按预期工作。
我创建了另一种方法来调试并查看发生了什么。 该度量定义为:
SetToStr(EXISTING([Date].[Date YMD].[Year].members))
如果我只选择了一个维度成员,这很好,我得到了这个:
{[日期].[日期 YMD].[全部].[2013]}
但是,只要我将 select 2012 和 2013 放在一起,我就会得到所有维度成员的列表:
{[Date].[Date YMD].[All].[N/A],[Date].[Date YMD].[All].[2007],[Date].[Date YMD].[All].[2008],[Date].[Date YMD].[All].[2009],[Date].[Date YMD].[All].[2010],[Date].[Date YMD].[All].[2011],[Date].[Date YMD].[All].[2012],[Date].[Date YMD].[All].[2013],[Date].[Date YMD].[All].[2014]}
EXISTING function 似乎仅在选择单个成员时才有效?
--
更新:
也许我在原始帖子中不够清楚。 如果日期维度被过滤(在 Excel pivot 表过滤器中)并且在过滤器中选择了多个日期成员(例如:一起选择 2012 年和 2013 年时),我面临的问题是获取第一个和最后一个日期成员.
我尝试使用此处的解决方案: http://bimic.blogspot.com/2011/07/mdx-rewrite-query-with-currentmember.html ,但没有成功。
我现在创建了 2 个措施:
HEAD( DESCENDANTS( [Date].[Date YMD].CURRENTMEMBER, [Date].[Date YMD].[Day] ), 1 ).ITEM(0).member_value
MIN(EXISTING [Date].[Date YMD].[Year].members, [Measures].[First Day Single])
不幸的是,我不能直接包含屏幕截图。 你可以在这个链接上看到它: http://social.msdn.microsoft.com/Forums/getfile/446659
如您所见,当在 pivot 表过滤器中选择一年时,这些措施有效,但当您在 select 超过一年时无效。
在我的多维数据集和通过Management Studio中,我可以编写如下脚本来创建基于每个月的第一天和最后一天返回数值的度量:
WITH
SET [Last12Months] AS
TAIL (
[Date].[Date - Calendar Month].[Calendar Month].members,
12)
MEMBER [Measures].[FirstDay] AS
HEAD(
DESCENDANTS(
[Date].[Date - Calendar Month].CURRENTMEMBER,
[Date].[Date - Calendar Month].[Calendar Day]
),
1
).ITEM(0).member_value
MEMBER [Measures].[LastDay] AS
TAIL(
DESCENDANTS(
[Date].[Date - Calendar Month].CURRENTMEMBER,
[Date].[Date - Calendar Month].[Calendar Day]
),
1
).ITEM(0).member_value
SELECT
{[Measures].[FirstDay],[Measures].[LastDay]} ON 0,
[Last12Months] ON 1
FROM [MyCube]
我们使用Office 2010
但使用OLAP Pivottables extensions
插件,我可以在数据OLAP Pivottables extensions
中添加以下两项措施:
1. [Measures].[FirstDay]
HEAD(
DESCENDANTS(
[Date].[Date - Calendar Month].CURRENTMEMBER,
[Date].[Date - Calendar Month].[Calendar Day]
),
1
).ITEM(0).member_value
2. [Measures].[LastDay]
TAIL(
DESCENDANTS(
[Date].[Date - Calendar Month].CURRENTMEMBER,
[Date].[Date - Calendar Month].[Calendar Day]
),
1
).ITEM(0).member_value
现在,无论我在Rows中使用什么,都可以从数据透视中获得正确的答案:
编辑
如果我操纵数据透视表以使我们的日期维度位于数据透视表的过滤器中,然后选择2013和2014年的多项选择,那么excel正在使用的`mdx'似乎如下:
WITH
MEMBER [Measures].[FirstDay] as
HEAD (
DESCENDANTS ( [Date].[Date - Calendar Month].CURRENTMEMBER, [Date].[Date - Calendar Month].[Calendar Day] )
, 1
).ITEM( 0 ).member_value
MEMBER [Measures].[LastDay] as
TAIL (
DESCENDANTS ( [Date].[Date - Calendar Month].CURRENTMEMBER, [Date].[Date - Calendar Month].[Calendar Day] )
, 1
).ITEM( 0 ).member_value
SELECT
{ [Measures].[FirstDay], [Measures].[LastDay] } ON COLUMNS
FROM
(
SELECT
({ [Date].[Date - Calendar Month].[Calendar Year].&[2012],
[Date].[Date - Calendar Month].[Calendar Year].&[2013] }) ON COLUMNS
FROM [OurCube]
)
我认为此脚本的自定义度量中的函数CURRENTMEMBER
的上下文将由于子选择而丢失。
这里有一个针对您问题的解决方法: http : //sqlblog.com/blogs/mosha/archive/2007/09/26/how-to-detect-subselect-inside-mdx-calculations-aka-multiselect-in- excel-2007.aspx 。 但是,正如作者(SSAS的开发者之一)所写的那样,“该解决方案既不优雅也不高效”。 无论如何,它需要将另一个度量值组添加到多维数据集,并编写一个存储过程。
真的很老的话题,但我在这里发布我的解决方案,因为我没有在其他地方找到解决方案:
使用 dymanic set 似乎对我有用,因为只会在上下文中填充成员:
CREATE DYNAMIC SET [LastUpdateSet]
AS
TAIL(
NONEMPTY(
[LastUpdateDate].[Date].ALLMEMBERS
, [Measures].[Quantity]
)
, 1)
;
CREATE MEMBER CURRENTCUBE.[Measures].[LastUpdateQuantity]
AS (
[LastUpdateSet].item(0)
, [Measures].[Quantity]
)
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.