MDX:如何访问当前选定的维度成员?

时间:2014-04-18 12:57:19

标签: ssas mdx

我试图在MDX中创建一个度量来获取所选时间段的第一天(我有一个YMD日期维度)。我使用EXISTING函数来获取所选成员。如果我只在Excel数据透视表过滤器中选择一个维度成员,它工作正常。但是,只要我选择多个成员(例如:2012& 2013),EXISTING功能就无法正常工作。

我已经创建了另一项调试措施,看看发生了什么。该措施定义为:

  

SetToStr(现有([日期]。[日期YMD]。[年]。成员))

如果我只选择了一个维度成员,这可以正常工作,我得到了回复:

  

{[Date]。[Date YMD]。[All]。[2013]}

但是,只要我一起选择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函数似乎只在选择了单个成员时才有效?

-

更新

也许我在原帖中不够清楚。我遇到的问题是如果过滤日期维度(在Excel数据透视表过滤器中)并在过滤器中选择了多个日期成员,则获取第一个和最后一个日期成员(例如:当2012年和2013年一起被选中时。)

我尝试过使用此处的解决方案:http://bimic.blogspot.com/2011/07/mdx-rewrite-query-with-currentmember.html,但没有成功。

我现在已经制定了两项措施:

  1. 首日单身:
  2. HEAD(
    DESCENDANTS(
        [Date].[Date YMD].CURRENTMEMBER,
        [Date].[Date YMD].[Day]
        ),
    1
    ).ITEM(0).member_value
    
    1. 第一天多年
    2. MIN(EXISTING [Date].[Date YMD].[Year].members, [Measures].[First Day Single])
      

      很遗憾,我无法直接提供屏幕截图。您可以在此链接上看到它:http://social.msdn.microsoft.com/Forums/getfile/446659

      正如您所看到的,当在数据透视表过滤器中选择一年时,这些措施会起作用,但是当您选择一年以上时,这些措施不起作用。

2 个答案:

答案 0 :(得分:3)

在我的多维数据集和管理工作室中,我可以编写一个这样的脚本来创建基于每个月的第一天和最后一天返回数值的度量:

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加载项我可以将以下两个度量添加到我的数据透视表中:

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中使用什么,我都能从枢轴中得到正确答案:

enter image description here


编辑

如果我操纵枢轴以使我们的日期维度在枢轴的过滤器中,然后进行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 context 将丢失。

答案 1 :(得分:0)

此处描述的问题有一种解决方法:http://sqlblog.com/blogs/mosha/archive/2007/09/26/how-to-detect-subselect-inside-mdx-calculations-aka-multiselect-in-excel-2007.aspx。但是,正如作者(SSAS的开发人员之一)所写,“解决方案既不优雅也不高效”。无论如何,它需要将另一个度量组添加到多维数据集,以及要写入的存储过程。