在 Excel 中使用 OLAP 多维数据集;确定较大日期范围内的每月值?

Working with an OLAP Cube in Excel; determine monthly values within a larger date range?

我在 excel 中作为枢轴 table 使用 OLAP 多维数据集已经有一段时间了,但最近我正在尝试整合一些计算量度来简化一些事情,我碰壁了。

多维数据集设置了指定月份和年份的日期过滤器(它们变得更具体,但未使用更精细的级别)。

这些行将列出各个项目,值可以反映 2 个度量:一个反映日期范围内的平均分数,另一个反映平均值所基于的观察次数。

我想创建一个计算量度,只要满足 2 个标准,它就会显示每个项目的平均分数:

  1. 整个日期范围至少有 100 个观测值
  2. 在数据透视表table中指定的日期范围内,没有观察到零的月份。

我还应该澄清一下,我使用的日期范围会有所不同和长度,并且不会总是以最近一个月结束,但它们总是以整月为增量。

我是其中的一部分,因为基于此计算的度量只有在日期范围内有足够的观察结果时才会为我提供平均值:

IIF([Measures].[OBSERVATIONS]>=100,[Measures].[AVERAGE],"^^")

现在,我需要添加零观察月份的标准。

我曾尝试使用 COUNT(),但在这种形式中,它忽略了数据透视表中设置的日期范围 table 和 returns 所有月份的计数,其中有任何值项目,包括零。

COUNT(([Calendar].[Calendar].[Month],[Measures].[OBSERVATIONS]),EXCLUDEEMPTY)

我尝试使用此表达式确定一个月内最少的观察次数,但它再次忽略了日期范围,并且不反映空单元格:

MIN([Calendar].[Calendar].[Month],[Measures].[OBSERVATIONS])

我认为 CurrentMember 是我需要包含的内容,但我无法让它为我工作。

假设它是相关的,但我不确定解释日历层次结构的最佳方式,所以这反映了我所拥有的:

第一个日历列表是用于筛选数据透视表 table 数据的列表,它也被拉入上面的 mdx 表达式中。

编辑:

感谢@SouravA 的回复。我尝试了一些方法,考虑到评论中的格式有限,下面是我所做的简要说明。

我收到一条错误消息 "Query(1,35) Parser: The syntax for 'WITH' is incorrect"

确保我正确使用它:

进行以下更改后,我将整个内容粘贴到 MDX 中:window 来自 Excel 中的 'calculated measures' 工具。

当然,我将 OBSERVATIONS 和 AVERAGE 更改为我的立方体中的变量名称。

我将“[Project].[ProjectCode]”更改为“[Project].[ProjectName]”,这就是我的多维数据集的设置方式。

在“[NewMeasure]”上,我将其更改为我用于计算度量的名称。

在“[你的立方体]”上,我尝试了几种不同的方法;我在 excel 的立方体公式中使用的立方体参考如下所示:'Cubename NormativeCube',所以我尝试将其粘贴到带引号和不带引号的括号中,将 NormativeCube 部分关闭,并在没有括号。

我还修改了 'WHERE' 之后的最后一行以反映日期范围,如下所示: '[日历].[日历].[月].&1&[2015]:[日历].[日历].[月].&[12]&[2015]'

我也将其设置为“[日历].[月].[月].&1:[日历].[月].[月].&[12]'

另外,还有一个问题;这适用于任何日期范围,还是打算在 MDX 中指定?我需要它根据多维数据集过滤器设置的日期范围运行。

编辑 2:

我只需要通过将“> 0”更改为“= 0”来稍微调整一下,因为原始解决方案仅显示日期范围内每个月没有数据的平均值,并且调整日历集表达式之一或其他。

IIF
 (
  [Measures].[OBSERVATIONS]>=100 
  AND 
  COUNT
    (
     FILTER
        (
        EXISTS
            (
            [Calendar].[Calendar].[Month].MEMBERS
            ,EXISTING [Calendar].[Calendar].[Month].MEMBERS
            )
        ,[Measures].[OBSERVATIONS] = 0
        )
    ) = 0
  ,[Measures].[AVERAGE]
  ,"^^"
 )

编辑 3:

发现一个限制;

仅当为多维数据集定义的日期范围位于日历层次结构的整个增量中时,该度量才有效;即一个月、一个季度或一年。做 2 个月、2 个季度、2 年,或者跨越 2 个季度或年将 return IIF() 表达式的 False 结果。

我试过几种不同的设置方法,但无法正常工作。

编辑 4:

回复:日历层次结构

查看 [calendar].[calendar] 下面有 4 个选项:Year、Quarter、Month 和 Date Key。

查看“年”、“季度”和“月”下的成员,您可以一直向下钻取到具体的一天。

这 3 个下的成员属性仅列出层次结构的下一级

在Date Key上,成员属性如下: 月份名称 一年中的月份 时间计算(据我所知这没什么用) 年周

编辑 5:

所以这是有效的(最终)。我一定是在某个时候搞砸了,编辑原始公式导致了我遇到的次要问题。这是对我有用的。

IIF
 (
  [Measures].[OBSERVATIONS]>=100 
  AND 
  COUNT
    (
     FILTER
        (
        EXISTS
            (
            [Calendar].[Calendar].[Month].Members
            ,EXISTING [Calendar].[Calendar].Members
            )
        ,[Measures].[OBSERVATIONS] = 0
        )
    ) > 0
  ,[Measures].[AVERAGE]
  ,"^^"
 )

当您希望计算识别特定选择(上下文)时,使用 EXISTING 子句有时会派上用场。以下代码是不言自明的。让我知道它是否有效。

WITH SET ZeroObservationMonths AS
FILTER
    (
    EXISTS
        (
        [Calendar].[Calendar].[Month].MEMBERS
        ,EXISTING [Calendar].[Calendar].[Date].MEMBERS
        )
     ,[Measures].[OBSERVATIONS] = 0
     )


MEMBER Measures.NewMeasure AS
IIF
 (
  [Measures].[OBSERVATIONS]>=100 AND COUNT(ZeroObservationMonths) > 0
  ,[Measures].[AVERAGE]
  ,"^^"
 )

SELECT [Project].[ProjectCode].MEMBERS ON 1,
Measures.[NewMeasure] ON 0
FROM [YourCube]
WHERE ({[Calendar].[Calendar].[Date].&D1: [Calendar].[Calendar].[Date].&D2})

编辑: 如果您计划在 excel 内创建度量,只需在 "New calculated measure"

的文本框中输入以下 MDX 代码
IIF
 (
  [Measures].[OBSERVATIONS]>=100 
  AND 
  COUNT
    (
     FILTER
        (
        EXISTS
            (
            [Calendar].[Calendar].[Month].MEMBERS
            ,EXISTING [Calendar].[Calendar].[Date].MEMBERS
            )
        ,[Measures].[OBSERVATIONS] = 0
        )
    ) > 0
  ,[Measures].[AVERAGE]
  ,"^^"
 )

编辑 2:如果过滤可以发生在任何属性上,而不仅仅是日期,请在上面的脚本中将 EXISTING [Calendar].[Calendar].[Date].MEMBERS 替换为 EXISTING [Calendar].[Calendar].MEMBERS