MDX计算各个日期的月初值

时间:2014-10-02 20:11:17

标签: date ssas mdx

我正在处理如下要求,我所拥有的解决方案要么不是解决完整问题,要么是非常慢,在许多情况下是不可行的。需要一点帮助。

问题:需要一个显示一系列具有4维(10个级别)交叉连接和日期维度的度量的查询,我需要确定度量的跨时段的第一个可用值,例如月初,年初等等..

我有

  • dimA - Level A1
  • dimB - Leve B1,B2,B3
  • dimC - Level 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值的那个。

  1. 根据度量M1创建一个持久性度量(M1SOM)并提供“FirstNonEmpty”的聚合函数:当我们在月级运行查询时,即上述情况下,这非常有效查询有[日期]。[月]。[月]。所有成员而不是[日期]。[日期]。[日期]。所有成员。它显示该月的第一个可用的非空值。但是,这意味着其他措施在月级汇总。如果我想显示其他度量的每日值以及此度量的SOM值,它将无法工作,因为范围现在更改为单个日期,我只是获得M1SOM度量中的每日值。

  2. 如下创建计算度量(M1SOM),以及上面的查询,同样的事情发生。无法在每日日期级别显示SOM值。

    WITH MEMBER [Measures].[M1SOM] AS ([Date].[Date].FirstChild,[Measures].[M1])

  3. 创建一个计算成员,如下所示,这有效!然而,查询绝对会杀死我的计算机并且需要永远执行,如果我在交叉连接中运行超过3个级别。

    WITH MEMBER M1SOM AS Head(NonEmpty({[Date].[Date].Parent.Children}*[Measures].[M1SOM])).Item(0)

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

    由于

    SRIKANTH

2 个答案:

答案 0 :(得分:0)

(这是未经测试的)

这是否会返回当月的第一个日期:

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]

对于玩时间段来说,这似乎是一个很好的参考: http://www.mssqltips.com/sqlservertip/2877/sql-server-analysis-serviceslead-lag-openingperiod-closingperiod-time-related-functions/

答案 1 :(得分:0)

所以我在Msft论坛上发布了同样的问题并收到了以下答案。它是他们提出的解决性能问题的工作。但是如果有人没有所有的交叉连接来放慢速度,请使用我在问题中列出的三个选项中的一个。

Like to MSFT answer

由于 斯

特别感谢WhyTheq耐心并尝试解决问题。感谢你的努力。