如何设置多个并行周期?

时间:2017-02-14 16:42:48

标签: sql-server ssas mdx olap

我想创建一个MDX查询,该查询返回两个日期之间每个月的第15天的度量值。

例如,2010-01-01和2016-12-15的结果应如下所示:

2016-12-15: 123
2016-11-15: 789
2016-10-15: 556
(...) 
2010-01-15: 456

我知道我可以使用DateDiff()函数计算两个日期之间的月数。另外,我可以使用ParallelPeriod()函数来获取上个月的值。

但是我不知道如何将这些值一起使用并且#34;迭代"从1到DateDiff()的结果是在" Days"中创建多个ParallelPeriod()调用。集。

WITH 
MEMBER NumberOfMonths AS
DateDiff("m", 
    [Calendar].[Day].&[20100101].MemberValue,
    [Calendar].[Day].&[20160315].MemberValue
) 

SET Days AS {
     PARALLELPERIOD([Calendar].[Month], 1, [Calendar].[Day].&[20160315]),
     PARALLELPERIOD([Calendar].[Month], 2, [Calendar].[Day].&[20160315]),
     PARALLELPERIOD([Calendar].[Month], 3, [Calendar].[Day].&[20160315])
     -- (...) How to generate this set automatically, using NumberOfMonths?
}

SELECT 
    { Days } ON 0,
    { Quantity } ON 1
FROM [MyCube]

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

这是一个有趣的问题,虽然有一个解决方案,但阅读MDX参考只是让我失明了。

以下是如何获得每月第十五天的一套:

WITH SET Months
AS
    [Calendar].[Month].Members

SET FifteenthDays AS
GENERATE(
    Months,
    StrToSet('HEAD(DESCENDANTS(Months.Current,[Calendar].[Day]),1).Item(0).Lead(14)')
    )

SELECT {} ON 0,
FifteenthDays ON 1
FROM TheCube

您可以通过过滤初始命名集" Months"来调整此值以满足您的要求。使用您的日期参数。

这是&#39>正在进行的事情:

  1. GENERATE / StrToSet组合将引号内的MDX应用于第一组的每个成员(" Months")
  2. Current函数类似于CurrentMember,但应用于Generate()括号内的集合。
  3. DESCENDANTS功能可以获得所有月份的孩子"在日级别(我必须使用这个而不是.Children,因为在我的立方体中还有另一代 - 周 - 在几个月和几天之间)
  4. HEAD函数获取当月的第一天。 (如果您的时间维度叶级别未按日期顺序排序,则可能需要将该集合包装在ORDER函数中。)
  5. MDX不会自动判断单例集(HEAD({},1)将总是返回单例或空集)是成员,您可以在其上应用成员函数。所以在应用Lead之前,我必须使用Item()函数。我不知道为什么这个功能有效,因为根据文档它有不同的用途。
  6. Lead(14)为您提供该月的第15天,因为该参数是从0开始的。

答案 1 :(得分:0)

MDX方法№1(具有总和聚合的计算成员):

WITH 
MEMBER [Measures].[Quantity15] AS
SUM(
    [Calendar].[Day].[Day].Members,
    IIF( 
        Right([Calendar].[Day].CurrentMember.Properties('Key'),2) = "15",
        [Measures].[Quantity],
        NULL
    )
)    

SELECT 
    NON EMPTY { [Calendar].[Day].&[20100101]:[Calendar].[Day].&[20160315] } ON 0,
    { [Measures].[Quantity15] } ON 1
FROM [MyCube]

MDX方法№2(没有新成员,过滤集合):

SELECT 
    NONEMPTY(
        {[Calendar].[Day].&[20100101]:[Calendar].[Day].&[20160315]},
        IIF(
            Right([Calendar].[Day].CurrentMember.Properties('Key'),2) = "15",
            1,
            NULL
        )
    ) ON 0,
    { [Measures].[Quantity] } ON 1
FROM [MyCube]