如何使用和不使用聚合组查询 MDX 中的日期字段

How to query Date field in MDX with and without aggregate group

我有一个看似简单的要求来创建一个价格数据查询,该查询将 return 不同日期的四组价格数据:

  1. 范围内的最低日期
  2. 范围内的最高日期
  3. 整个范围的总和

我最接近的是以下查询:

WITH set [Range] as {[Effective Date].[Date].&[2015-12-01T00:00:00] : [Effective Date].[Date].&[2015-12-31T00:00:00]}
select
NON EMPTY{
    filter([Effective Date].[Date].&[2015-12-01T00:00:00], [Measures].[Plan Price]),
    filter([Effective Date].[Date].&[2015-12-31T00:00:00], [Measures].[Plan Price]),
    nonempty([Measures].[Money In], [Range]),
    nonempty([Measures].[Money Out], [Range])
} on 0,
NON EMPTY{
[Region Manager].[Full Name].[Full Name]
} on 1
from [Cube]

但是,日期范围如此 return 错误:

Two sets specified in the function have different dimensionality.

"filter" 或 "nonempty" 语句将单独工作,但我无法让它们在单个查询中工作。我怎样才能做到这一点?使用子查询会有帮助吗?

除非您使用的是我从未见过的 MDX 方言,否则无需使用双大括号 ({{....}})。

大括号表示内容是一个集合。在大括号内,逗号 (,) 是 UNION 运算符:

{Tom,Dick,Harry}

给出一套三人

因为你在这里使用了大括号:

non empty{{
    filter([Effective Date].[Date].&[2015-12-01T00:00:00], [Measures].[Plan Price]),
    filter([Effective Date].[Date].&[2015-12-31T00:00:00], [Measures].[Plan Price]),
    nonempty([Measures].[Money In], [Range]),
    nonempty([Measures].[Money Out], [Range])
}}

解析器正在尝试从生效日期维度的两个成员和度量维度的两个成员中形成一个集合。这是不可能的,因为它们的维度不同。

如果解析器告诉您

function

指的是集合定义中的UNION(,)函数。这就是适合您的 MDX 解析器...

如果要在同一轴上显示两个度量和两个日期,请将这两个日期定义为计算度量(例如,WITH MEMBER Measures.Bla AS Head([Range],1)。

试试这个:

WITH 
  SET [Range] AS 
    {
      [Effective Date].[Date].&[2015-12-01T00:00:00] 
    : [Effective Date].[Date].&[2015-12-31T00:00:00]
    }
SELECT
NON EMPTY
    {
      ([Effective Date].[Date].&[2015-12-01T00:00:00], [Measures].[Plan Price])
     ,([Effective Date].[Date].&[2015-12-31T00:00:00], [Measures].[Plan Price])
     ,{nonempty([Range]*[Measures].[Money In])}
     ,{nonempty([Range]*[Measures].[Money Out])}
    }
ON 0,
NON EMPTY [Region Manager].[Full Name].[Full Name] ON 1
FROM [Cube];

但是 NonEmpty 并不是真正需要的,所以这样更简洁:

WITH 
  SET [Range] AS 
    {
      [Effective Date].[Date].&[2015-12-01T00:00:00] 
    : [Effective Date].[Date].&[2015-12-31T00:00:00]
    }
SELECT
NON EMPTY
    {
      ([Effective Date].[Date].&[2015-12-01T00:00:00], [Measures].[Plan Price])
     ,([Effective Date].[Date].&[2015-12-31T00:00:00], [Measures].[Plan Price])
     ,{[Range]*[Measures].[Money In]}
     ,{[Range]*[Measures].[Money Out]}
    }
ON 0,
NON EMPTY [Region Manager].[Full Name].[Full Name] ON 1
FROM [Cube];

要聚合,您需要一个新的自定义度量:

WITH 
  SET [Range] AS 
    {
      [Effective Date].[Date].&[2015-12-01T00:00:00] 
    : [Effective Date].[Date].&[2015-12-31T00:00:00]
    }
  MEMBER [Effective Date].[Date].[All].[AggRange] AS 
    Aggregate([Range])
SELECT
NON EMPTY
    {
      ([Effective Date].[Date].&[2015-12-01T00:00:00], [Measures].[Plan Price])
     ,([Effective Date].[Date].&[2015-12-31T00:00:00], [Measures].[Plan Price])
     ,([Effective Date].[Date].[All].[AggRange],[Measures].[Money In])
     ,([Effective Date].[Date].[All].[AggRange],[Measures].[Money Out])
    }
ON 0,
NON EMPTY [Region Manager].[Full Name].[Full Name] ON 1
FROM [Cube];