Date MDX计算各个日期的月初值

Date MDX计算各个日期的月初值,date,ssas,mdx,Date,Ssas,Mdx,我正在处理一个如下的需求,我的解决方案要么没有解决完整的问题,要么速度非常慢,在很多情况下根本不可行。同样需要一些帮助 问题:需要一个查询来显示一组具有4维10级交叉联接和一个日期维的度量值,我需要确定度量值跨时间段的第一个可用值,如月初、年初等 我有 dimA-A1级 dimB-级别B1、B2、B3 dimC-C1级 dimD-D1、D2、D3、D4、D5级 日期维度-日期、月、年作为级别。 测量值-M1至M5 查询: SELECT NON EMPTY {[Measures].[M1]

我正在处理一个如下的需求,我的解决方案要么没有解决完整的问题,要么速度非常慢,在很多情况下根本不可行。同样需要一些帮助

问题:需要一个查询来显示一组具有4维10级交叉联接和一个日期维的度量值,我需要确定度量值跨时间段的第一个可用值,如月初、年初等

我有

dimA-A1级 dimB-级别B1、B2、B3 dimC-C1级 dimD-D1、D2、D3、D4、D5级 日期维度-日期、月、年作为级别。 测量值-M1至M5 查询:

SELECT 
   NON EMPTY {[Measures].[M1],
              [Measures].[M2],
              [Measures].[M3],
              [Measures].[M4],
              [Measures].[M5],
              [Measures].[M1SOM]} ON COLUMNS
  ,NON EMPTY 
            {
    [DimA].[A1].[A1].ALLMEMBERS*
    [DIMB].[B1].[B1].ALLMEMBERS*
    [DIMB].[B2].[B2].ALLMEMBERS*
    [DIMB].[B3].[B3].ALLMEMBERS*
    [DIMB].[B4].[B4].ALLMEMBERS*
    [DIMB].[B5].[B5].ALLMEMBERS*
    [DIMC].[C1].[C1].ALLMEMBERS*
    [DIMD].[D1].[D1].ALLMEMBERS*
    [DIMD].[D2].[D2].ALLMEMBERS*
    [DIMD].[D3].[D3].ALLMEMBERS*
    [Date].[Date].[Date].ALLMEMBERS*
    [Date].[Month].[Month].ALLMEMBERS*
} ON ROWS
FROM [Cube]
***上面的查询包含所有这些交叉连接,因为此查询将为SSRS报告数据集提供动力

我需要创建一个新的计算度量值或显示月初和年初值的实际持久度量值。以下是我目前的选择。让我们假设,度量M1是我需要SOM和SOY值的度量

基于度量值M1创建持久化度量值M1SOM,并提供FirstNoneEmpty的聚合函数:当我们在月份级别运行查询时,即在上面的查询中使用[Date].[Month].[Month].[Month]。Allmembers而不是[Date].[Date].[Date]。Allmembers时,此函数非常有效。它显示当月第一个可用的非空值。然而,这意味着其余的度量是在月份级别进行聚合的。如果我想显示其他度量值的每日值以及此度量值的SOM值,它将不起作用,因为范围现在更改为单个日期,并且我也只获得M1SOM度量值中的每日值

创建一个计算出的度量M1SOM,如下所示,以及上面的查询,同样的事情也会发生。无法在每日日期级别显示SOM值

成员[Measures].[M1SOM]为[Date].[Date].FirstChild[Measures].[M1]

创建一个计算成员如下,这是工作!但是,如果我在交叉连接中使用3个以上的级别运行查询,那么查询绝对会杀死我的机器,并且永远无法执行

将成员M1SOM作为headNoneEmpty{[Date].[Date].Parent.Children}*[Measures].[M1SOM].Item0

是否有更好的方法在日常水平上实现SOM和SOY计算

谢谢

Srikanth

这是未经测试的

是否返回该月的第一个日期:

WITH MEMBER [Measures].[FirstDayOfMonth] AS 
    OpeningPeriod(
      [Date].[Date].[Date],
      [Date].[Date].CURRENTMEMBER.PARENT
    ).MemberValue 
SELECT 
   NON EMPTY {[Measures].[M1],
              [Measures].[M2],
              [Measures].[M3],
              [Measures].[M4],
              [Measures].[M5],
              [Measures].[FirstDayOfMonth] } ON COLUMNS
  ,NON EMPTY 
            {
    [DimA].[A1].[A1].ALLMEMBERS*
    [DIMB].[B1].[B1].ALLMEMBERS*
    [DIMB].[B2].[B2].ALLMEMBERS*
    [DIMB].[B3].[B3].ALLMEMBERS*
    [DIMB].[B4].[B4].ALLMEMBERS*
    [DIMB].[B5].[B5].ALLMEMBERS*
    [DIMC].[C1].[C1].ALLMEMBERS*
    [DIMD].[D1].[D1].ALLMEMBERS*
    [DIMD].[D2].[D2].ALLMEMBERS*
    [DIMD].[D3].[D3].ALLMEMBERS*
    [Date].[Date].[Date].ALLMEMBERS*
    [Date].[Month].[Month].ALLMEMBERS*
} ON ROWS
FROM [Cube]
再次未经测试

WITH MEMBER [Measures].[FirstDayOfMonthM1] AS 
    (
      OpeningPeriod(
        [Date].[Date].[Date],
        [Date].[Date].CURRENTMEMBER.PARENT
      ),
    [Measures].[M1]
    )
SELECT 
   NON EMPTY {[Measures].[M1],
              [Measures].[M2],
              [Measures].[M3],
              [Measures].[M4],
              [Measures].[M5],
              [Measures].[FirstDayOfMonthM1] } ON COLUMNS
  ,NON EMPTY 
            {
    [DimA].[A1].[A1].ALLMEMBERS*
    [DIMB].[B1].[B1].ALLMEMBERS*
    [DIMB].[B2].[B2].ALLMEMBERS*
    [DIMB].[B3].[B3].ALLMEMBERS*
    [DIMB].[B4].[B4].ALLMEMBERS*
    [DIMB].[B5].[B5].ALLMEMBERS*
    [DIMC].[C1].[C1].ALLMEMBERS*
    [DIMD].[D1].[D1].ALLMEMBERS*
    [DIMD].[D2].[D2].ALLMEMBERS*
    [DIMD].[D3].[D3].ALLMEMBERS*
    [Date].[Date].[Date].ALLMEMBERS*
    [Date].[Month].[Month].ALLMEMBERS*
} ON ROWS
FROM [Cube]
这似乎是一个很好的时间段参考:
所以我在Msft论坛上发布了同样的问题,并收到了以下答案。这是他们提出的解决性能问题的解决办法。但是,如果有人没有所有的交叉连接来降低他们的速度,请使用我在问题中列出的三个选项之一

谢谢 斯里兰卡


特别感谢WhyTheq的耐心和尝试解决方案。感谢您的努力。

是的,的确如此。只有OpeningPeriod[Date].[Date].[Date].[Date].Name也可以。效率如何?它还会杀死你的机器吗?好消息-很高兴我能帮忙-MDX是一种非常好的语言。嗯。。也许我的问题还不清楚,但是在时间维度上得到第一个孩子并不能解决这个问题。问题是查询需要在指定的时间窗口显示第一个非空度量值。例如,它必须在月初值非空值旁边显示当前天数度量值。如果当月第一天没有值,则在timedimension的第一个子级查询度量值将返回null。请让我知道这个解释是否清楚。感谢您的响应,此响应返回一个月内第一个可用日期的值。但是我们仍然遇到这样的问题:如果第一天没有报告值,此查询将返回null,而要求显示第一个非空值。即,在4月份,如果4月1日没有度量值,但3日有度量值,则此查询将返回null,我们希望3日的值显示为月初值。