MDX YTD超范围(:)

时间:2015-07-09 15:55:11

标签: mdx mondrian

YTD能否处理日期范围?

我试图将当年的X天与上一年的同一时期进行比较。

我的MDX查询如下所示:

WITH MEMBER [Measures].[Prior YTD Amount] AS SUM
(
   YTD
   (
      ParallelPeriod
      (
         [Date].[Year],
         1,
         [Date].CurrentMember
      )
   )
   ,
   [Measures].[Amount]
)
set [ColSet] as
{
   [Measures].[Amount],
   [Measures].[Prior YTD Amount]
}
set [RowSet] as
{
   [Motif].[Categorie].Members
}
SELECT
NON EMPTY [ColSet] ON COLUMNS,
NON EMPTY [RowSet] ON ROWS
FROM [Things]
WHERE
{
   [Date].[2015].[2].[1]:[Date].[2015].[2].[9]
}

我正在使用Mondrian 3.6。

2 个答案:

答案 0 :(得分:2)

简而言之,这段代码不起作用。原因是以下代码行正在查找您已将Currentmember应用于的所有层次结构的单个成员:

[Date].CurrentMember

您在[Date].[2015].[2].[1]:[Date].[2015].[2].[9]

集合中有多个成员

以上是上述的一个小证明:

这个脚本:

WITH 
  MEMBER [Measures].[x] AS 
    [Date].[Calendar].CurrentMember.Member_Key 
SELECT 
  {[Product].[Category].[All Products]} ON 0
 ,{[Measures].[x]} ON 1
FROM [Adventure Works]
WHERE 
  {
      [Date].[Calendar].[Date].&[20080322]
  };

返回:

enter image description here

而这个脚本:

WITH 
  MEMBER [Measures].[x] AS 
    [Date].[Calendar].CurrentMember.Member_Caption 
SELECT 
  {[Product].[Category].[All Products]} ON 0
 ,{[Measures].[x]} ON 1
FROM [Adventure Works]
WHERE 
  {
      [Date].[Calendar].[Date].&[20080322]
    : 
      [Date].[Calendar].[Date].&[20080323]
  };

返回:

enter image description here

错误讯息:

enter image description here

AdvWrks中,如果您可以将目标日期范围从WHERE子句移动到命名集,我刚刚编写了以下内容,这可能有所帮助。

工作原理:

1.通过.Item(0).Item(0)来确定您的命名集中的第一个日期 2.通过.Item([myStartDates].Count - 1).Item(0)确定命名集中的最后日期 3.使用找到的两个日期创建一个平行的范围

WITH 
  SET [myStartDates] AS 
    {
        [Date].[Calendar].[Date].&[20080322]
      : 
        [Date].[Calendar].[Date].&[20080323]
    } 
  SET [parallelToFirst] AS 
    ParallelPeriod
    (
      [Date].[Calendar].[Calendar Year]
     ,1
     ,[myStartDates].Item(0).Item(0)
    ) 
  SET [parallelToLast] AS 
    ParallelPeriod
    (
      [Date].[Calendar].[Calendar Year]
     ,1
     ,[myStartDates].Item(
      [myStartDates].Count - 1).Item(0)
    ) 
  SET [Rebuild] AS 
    [parallelToFirst].Item(0) : [parallelToLast].Item(0) 
SELECT 
  {} ON COLUMNS
 ,[Rebuild] ON ROWS
FROM [Adventure Works];

足够容易然后对该范围求和并将其弹出日期维度:

WITH 
  SET [myStartDates] AS 
    {
        [Date].[Calendar].[Date].&[20080322]
      : 
        [Date].[Calendar].[Date].&[20080323]
    } 
  SET [parallelToFirst] AS 
    ParallelPeriod
    (
      [Date].[Calendar].[Calendar Year]
     ,1
     ,[myStartDates].Item(0).Item(0)
    ) 
  SET [parallelToLast] AS 
    ParallelPeriod
    (
      [Date].[Calendar].[Calendar Year]
     ,1
     ,[myStartDates].Item(
      [myStartDates].Count - 1).Item(0)
    ) 
  SET [ParallelRange] AS 
    [parallelToFirst].Item(0) : [parallelToLast].Item(0) 
  MEMBER [Date].[Calendar].[parallelSum] AS 
    Sum([ParallelRange]) 
SELECT 
  {
    [myStartDates]
   ,[ParallelRange]
   ,[Date].[Calendar].[parallelSum]
  } ON 0
 ,{
    [Measures].[Internet Sales Amount]
   ,[Measures].[Internet Order Quantity]
  } ON 1
FROM [Adventure Works];

这是结果(只是为了证明它正在做我们想要的):

enter image description here

答案 1 :(得分:0)

以下是使用ParallelPeriods函数的替代方法。 我假设您拥有多维数据集中上一年的所有日期,即中间没有缺少日期或者"间隙"。如果是这样,您可以使用LAG功能跳转到365天(1年)的日期。此外,将当前年份的日期初始设置为一组。这样你就可以轻松地对它们进行参数化。

您的最终MDX应该看起来有点类似于:

with set Dates as
{
  [Date].[2015].[2].[1]
  :
  [Date].[2015].[2].[9]
}//<<This can be also written as 
 //StrToSet("{[Date]."+ @DateStart + ":" +  "[Date]."+ @DateEnd + "}")
//@Date1 and @Date2 being the parameters you can pass from front end

set datesPrevYear as
{
  head(Dates, 1).item(0).LAG(365).item(0) \\<<Gets the starting date's 1 year previous date
  : 
  tail(Dates, 1).item(0).LAG(365).item(0) \\<<Gets the ending date's 1 year previous date
} 

member [Measures].[Prior YTD Amount] as
sum(datesPrevYear, [Measures].[Amount])

set [ColSet] as
{
  [Measures].[Amount],
  [Measures].[Prior YTD Amount]
}
set [RowSet] as
{
  [Motif].[Categorie].Members
}

select
non empty [ColSet] on columns,
non empty [RowSet] on rows
from [Things]