MDX:单周期列时间聚合中的混合行聚合类型

时间:2015-07-15 14:47:40

标签: mdx mondrian

我正在尝试用一种方法来解决蒙德里安立方体产生以下结果的问题。

示例值:

Year  Month  Sales
----  -----  -----
2015  Jan     10 
2015  Feb     11 
2015  Mar     12 
2015  Apr     10 
2015  May     11 
2015  Jun     12 


                        Jan-Mar 2015 | Apr-Jun 2015
---------------------------------------------------
Sales Sum              |      33     |     33
Sales Average          |      11     |     11

目前的MDX是这样的:

with
     member [Date].[JAN-MAR] as Aggregate([Date].[2015].[3].lag(2):[Date].[2015].[3])
     member [Date].[APR-JUN] as Aggregate([Date].[2015].[6].lag(2):[Date].[2015].[6])
     member [Measures].[Sales Sum] as Sum([Date].CurrentMember, [Measures].[Sales])
     member [Measures].[Sales Average] as Avg([Date].CurrentMember, [Measures].[Sales])
select
     {[Date].[JAN-MAR],
      [Date].[APR-JUN]} on columns,
     {[Measures].[Sales Sum],
      [Measures].[Sales Average]} on rows
from [Cube] 

问题是如何获取一行来指定用于当前列周期聚合的聚合?

更新(2018年8月17日)

我认为我已经找到了解决方案,在我开始之前我认为我应该给出更多背景信息。我们正在使用Mondrian提供一些财务报告。由于报告的复杂性以及最终用户必须能够创建报告的事实,我们已经创建了自己的迷你报告工具。

最常见的报告类型之一是对具有各种日期聚合的行和列的度量,例如所有基于报告参数日期选择偏移的三个月滚动平均值/财务年度等。

复杂性来自同一列,他们希望不同的行以不同的方式聚合。一个例子是财政年度到日期列,一些行度量必须加总,一些必须平均,一些必须返回期末余额。

我还没有找到一个简单的想要在立方体中建模:/

然而,我找到了一种方法,让它错误地工作,看起来相当强大,也很快。事实证明,Mondrian不会验证成员属性,即您可以声明和引用您想要的任何成员属性。事实证明这提供了一种简单的方法来访问正确的日期切片并执行我想要的任何聚合,例如:

with
     member [Date].[JAN-MAR] as Aggregate([Date].[2015].[3].lag(2):[Date].[2015].[3]), START_MONTH_MEMBER='[Date].[2015].[1]', END_MONTH_MEMBER='[Date].[2015].[3]'
     member [Date].[APR-JUN] as Aggregate([Date].[2015].[6].lag(2):[Date].[2015].[6]), START_MONTH_MEMBER='[Date].[2015].[4]', END_MONTH_MEMBER='[Date].[2015].[6]'
     member [Measures].[Sales Sum] as Sum([Date].CurrentMember, [Measures].[Sales])
     member [Measures].[Sales Average] as Avg(StrToMember([Date].CurrentMember.Properties('START_MONTH_MEMBER')):StrToMember([Date].CurrentMember.Properties('END_MONTH_MEMBER')), [Measures].[Sales])
select
     {[Date].[JAN-MAR],
      [Date].[APR-JUN]} on columns,
     {[Measures].[Sales Sum],
      [Measures].[Sales Average]} on rows
from [Cube] 

到目前为止,效果很好。有一件事不起作用是我无法让StrToSet工作。理论上,您应该能够在with member属性中声明一个集合,然后在度量中使用它。

StrToMember(([Date].CurrentMember.Properties('MONTH_RANGE_SET'))

所以这就是我现在所做的工作,会不会对此有所反馈?

2 个答案:

答案 0 :(得分:0)

远非理想,但我现在能做的最好:

WITH 
  SET [JAN-MAR] AS 
      [Date].[Calendar].[Month].&[2006]&[3].Lag(2)
    : 
      [Date].[Calendar].[Month].&[2006]&[3] 
  SET [APR-JUN] AS 
      [Date].[Calendar].[Month].&[2006]&[6].Lag(2)
    : 
      [Date].[Calendar].[Month].&[2006]&[6] 
  MEMBER [Date].[Calendar].[JAN-MAR] AS 
    Aggregate([JAN-MAR]) 
  MEMBER [Date].[Calendar].[APR-JUN] AS 
    Aggregate([APR-JUN]) 
  MEMBER [Measures].[Sales Sum] AS 
    [Measures].[Internet Sales Amount] 
  MEMBER [Measures].[Sales Average] AS 
    [Measures].[Internet Sales Amount] / [JAN-MAR].Count 
SELECT 
  {
    [Date].[Calendar].[JAN-MAR]
   ,[Date].[Calendar].[APR-JUN]
  } ON 0
 ,{
    [Measures].[Sales Sum]
   ,[Measures].[Sales Average]
  } ON 1
FROM [Adventure Works];

所以我想也许我会尝试将自定义成员添加到不相关的维度(有效地使其成为utility维度)。这项工作正常,但提取相关月份的数量仍然很难。这是当前的努力:

WITH 
  SET [JAN-MAR] AS 
      [Date].[Calendar].[Month].&[2006]&[3].Lag(2)
    : 
      [Date].[Calendar].[Month].&[2006]&[3] 
  SET [APR-JUN] AS 
      [Date].[Calendar].[Month].&[2006]&[6].Lag(2)
    : 
      [Date].[Calendar].[Month].&[2006]&[6] 
  MEMBER [Product].[Category].[JAN-MAR] AS 
    Aggregate
    (
      [JAN-MAR]
     ,[Product].[Category].[All Products]
    ) 
  MEMBER [Product].[Category].[APR-JUN] AS 
    Aggregate
    (
      [APR-JUN]
     ,[Product].[Category].[All Products]
    ) 
  MEMBER [Measures].[Sales Sum] AS 
    [Measures].[Internet Sales Amount] 
  MEMBER [Measures].[Sales Avg] AS 
      [Measures].[Internet Sales Amount]
    / 
      NonEmpty
      (
        [Date].[Calendar].[Month].MEMBERS
       ,(
          [Product].[Category].CurrentMember
         ,[Measures].[Internet Sales Amount]
        )
      ).Count //<<<<currently returning 72 rather than 3
SELECT 
  {
    [Product].[Category].[JAN-MAR]
   ,[Product].[Category].[APR-JUN]
  } ON 0
 ,{
    [Measures].[Sales Sum]
   ,[Measures].[Sales Avg]
  } ON 1
FROM [Adventure Works];

我们可以看到它除以72而不是3:

enter image description here

问题,因为我目前看到它试图在聚合之后抓住每个自定义成员的相关月份数量 - 这是我的意思的简化示例:

WITH 
  SET [JAN-MAR] AS 
      //<< set of 3 months
      [Date].[Calendar].[Month].&[2006]&[1]
    : 
      [Date].[Calendar].[Month].&[2006]&[3] 
  MEMBER [Product].[Category].[JAN-MAR] AS 
    //<< chuck on unconnected hierarchy
    Aggregate
    (
      [JAN-MAR]
     ,[Product].[Category].[All Products]
    ) 
  MEMBER [Measures].[countMonthsRelatedToMember] AS  //<<attempt to count mths related to [Product].[Category].[JAN-MAR]    
    NonEmpty
    (
      [Date].[Calendar].[Month].MEMBERS
     ,(
        [Product].[Category].CurrentMember
       ,[Measures].[Internet Sales Amount]
      )
    ).Count //<<<<currently returning 72 rather than 3
SELECT 
  [Product].[Category].[JAN-MAR] ON 0
 ,[Measures].[countMonthsRelatedToMember] ON 1
FROM [Adventure Works];

答案 1 :(得分:0)

这有点耗时,但应该有效:

with
     member [Date].[JAN-MAR] as Aggregate([Date].[2015].[3].lag(2):[Date].[2015].[3])
     member [Date].[APR-JUN] as Aggregate([Date].[2015].[6].lag(2):[Date].[2015].[6])        
     member [Measures].[Sales Sum] as Sum([Date].CurrentMember, [Measures].[Sales])
     member [measures].yearvalues as [Date].currentmember.member_value
     member [Measures].[Sales Average] as 
     AVG
       (
        StrToSet(
                    "[Date].[2015].&["           + 
                    CASE
                         LEFT(measures.yearvalues, 3) 
                         WHEN "JAN" THEN 1 
                         WHEN "APR" THEN 4 END           + 
                    "]:[Date].[2015].&["         + 
                    CASE
                         RIGHT(measures.yearvalues, 3) 
                         WHEN "MAR" THEN 3
                         WHEN "JUN" THEN 5 END           +
                    "]"
                )
        ,
        [Measures].[Sales]
      ),
    format_string = "#.##"
select
     {[Date].[JAN-MAR],
      [Date].[APR-JUN]} on columns
     {[Measures].[Sales Sum],
      [Measures].[Sales Average]} on columns
from [Cube]