【问题标题】:MDX: How to access currently selected dimension members?MDX:如何访问当前选定的维度成员?
【发布时间】:2014-04-18 12:57:18
【问题描述】:

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

我创建了另一种方法来调试并查看发生了什么。度量定义为:

SetToStr(EXISTING([Date].[Date YMD].[Year].members))

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

{[日期].[YMD 日期].[全部].[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,但没有成功。

我现在创建了 2 个度量:

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

很遗憾,我无法直接包含屏幕截图。你可以在这个链接上看到它:http://social.msdn.microsoft.com/Forums/getfile/446659

如您所见,当您在数据透视表过滤器中选择一年时,度量值有效,但在您选择超过一年时无效。

【问题讨论】:

  • 您使用什么工具来添加这个新度量?您是通过 SQL-Server Management Studio 编写此 MDX,还是使用 Excel 连接到您的多维数据集?
  • 我正在使用 OLAP 数据透视表扩展。
  • 第一天不取决于当前的粒度吗?假设您选择了 2012 年和 2013 年 2 年,它将选择第一年的第一天 - 即 2012 年 1 月 1 日。这不是正确的吗?
  • 嗨斯蒂芬!是的,我预计会在第一年的第一天回来(例如 1.1.2012),但事实并非如此。如果选择了多年,我发布的代码将不起作用。看截图:social.msdn.microsoft.com/Forums/getfile/446659
  • @StephenBorg 这是我们所期望的,但不是观察到的行为

标签: ssas mdx


【解决方案1】:

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

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


编辑

如果我操作枢轴,使我们的日期维度在枢轴的过滤器中,然后选择 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上下文会因为子选择而丢失。

【讨论】:

  • 我已经尝试了您的解决方案,但问题与我的措施相同。您的度量“FirstDay”和“LastDay”在单个日期成员的上下文中工作正常(如果您在行上有日期维度,在列上有度量)。但是,如果您将日期维度放在数据透视表过滤器中并在过滤器中选择多个日期维度成员(例如,如果您一起选择 2 年,比如 2012 年和 2013 年),那么“FirstDay”将始终返回日期中的第一个成员未应用过滤器的维度(在我的情况下为 1.1.1900)和“LastDay”最后一个(在我的情况下为 31.12.2014)。
  • 嗨 saso - 从编辑到 OP 看起来我的回答有点帮助......感谢海报的回答通常涉及提高答案 +1!我可以再玩一玩。
  • 嗨!不幸的是,我还不能投票给答案。 :/ 我对 stackoverflow 还很陌生,还没有足够的声誉......我会再玩一些,再次感谢您的帮助!
  • 我明白你的意思 - Excel 采用组合成员并将它们用于子选择而不是 WHERE 子句。认为某种解决方法将是唯一的解决方案。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多