mdx - 使用 Mondrian/MDX 按季度分组 : Behavior of Sum and Count vs Avg

标签 mdx pentaho olap mondrian

我正在尝试对季度组进行汇总(总和和平均值),但根据我使用的方法,我会得到不同的结果。我想知道为什么。

以下基本查询说明了我的数据(Pentaho SteelWheels 示例):

SELECT  {Measures.Sales, Measures.Quantity} ON COLUMNS
,       ORDER(
          Time.Quarters.Members,
          Time.CurrentMember.Caption,
          BASC
        ) ON ROWS
FROM    SteelWheelsSales

结果:

Time |  Sales     |Quantity
-----+------------+---------
QTR1 |  445094.69 |  4561
QTR1 |  877418.97 |  8694
QTR1 | 1111260.1  | 10995
QTR2 |  564842.02 |  5695
QTR2 |  847713.97 |  8443
QTR2 |  869565.24 |  8480
QTR3 |  687268.87 |  6629
QTR3 | 1145308.08 | 11311
QTR4 | 1980178.42 | 19554
QTR4 | 2117298.82 | 20969

因此行标题是季度的标题,不同出现的 QTR1、QTR2、QTR3 和 QTR4 分别属于特定年份(因此第一个 QTR1 实际上是 [2003].[QTR1],第二个是 [2004] ].[QTR1],第三个是[2005].[QTR1],依此类推)

我想要的结果是将 [QTR1] 的所有出现视为一个组,并且单元格值聚合销售数量度量。假设我想至少查看总和(无论年份如何,所有季度 1、2、3 和 4 的总数量)和平均值(无论年份如何,所有季度 1、2、3 和 4 的平均数量)

现在,我看到了这个问题:

How can I merge two members into one in a query?

虽然该解决方案确实有帮助,但它要求我枚举需要分组的季度。我想动态地做到这一点。

我提出了这个查询:

WITH
SET     OrderedQuarters
AS      Order(
          Time.Quarters.Members,
          Time.CurrentMember.Caption,
          BASC
        )
SET     UniqueQuarters
AS      Filter(
          OrderedQuarters,
          OrderedQuarters.Item(
            OrderedQuarters.CurrentOrdinal-1
          ).Caption <> Time.CurrentMember.Caption
        )
MEMBER  Measures.QuantitySum
AS      Sum(
          Filter(
            OrderedQuarters,
            UniqueQuarters.Item(
              UniqueQuarters.CurrentOrdinal
            ).Caption = Time.CurrentMember.Caption
          )
        , Measures.Quantity
        )
MEMBER  Measures.Counter
AS      Count(
          Filter(
            OrderedQuarters,
            UniqueQuarters.Item(
              UniqueQuarters.CurrentOrdinal
            ).Caption = Time.CurrentMember.Caption
          )
        )
MEMBER  Measures.[Sum over Count]
AS      Measures.QuantitySum / Measures.Counter
MEMBER  Measures.AvgQuantity
AS      Avg(
          Filter(
            OrderedQuarters,
            UniqueQuarters.Item(
              UniqueQuarters.CurrentOrdinal
            ).Caption = Time.CurrentMember.Caption
          )
        , Measures.Quantity
        )
SELECT {Measures.QuantitySum
       ,Measures.Counter
       ,Measures.[Sum over Count]
       ,Measures.AvgQuantity} ON COLUMNS
,       UniqueQuarters        ON ROWS
FROM    SteelWheelsSales

这给出了这个结果:

Time | QuantitySum | Counter |  Sum over Count  | AvgQuantity
-----+-------------+---------+------------------+----------------
QTR1 |       24250 |       3 |  8083 3333333333 | 8083.3333333333
QTR2 |       22618 |       3 |  7539.3333333333 | 8083.3333333333
QTR3 |       17940 |       2 |  8970            | 8083.3333333333
QTR4 |       40523 |       2 | 20261.5          | 8083.3333333333

现在,虽然 [QuantitySum] 和 [Sum over Count] 度量给了我想要的结果,但我并不完全满意:

  1. [QuantitySum] 通过 Sum 显式计算。我希望隐式计算它,因为它已经在多维数据集中定义为总和聚合度量
  2. 我正在 [Sum over Count] 计算度量中明确计算平均值。我想使用 Avg() 并尝试使用 Measures.AvgQuantity,但这似乎并不符合我的预期。看起来它计算了第一季度的平均值,然后也为其他季度重复了该值。为什么? Sum 和 Count 似乎完全按照预期工作,为什么 Avg 如此不同?

最佳答案

这本身并不是一个答案,因为我还没有尝试过,而且我的 MDX 知识太旧了,完全没有信心它会起作用。但是,正如 Twitter 上提到的,我想知道以下内容是否行不通?具体来说,使用 Time.Years.Members 作为要进行平均的成员列表。

WITH
SET     OrderedQuarters
AS      Order(
          Time.Quarters.Members,
          Time.CurrentMember.Caption,
          BASC
        )
SET     UniqueQuarters
AS      Filter(
          OrderedQuarters,
          OrderedQuarters.Item(
            OrderedQuarters.CurrentOrdinal-1
          ).Caption <> Time.CurrentMember.Caption
        )
MEMBER  Measures.QuantitySum
AS      Sum(
          Filter(
            OrderedQuarters,
            UniqueQuarters.Item(
              UniqueQuarters.CurrentOrdinal
            ).Caption = Time.CurrentMember.Caption
          )
        , Measures.Quantity
        )
MEMBER  Measures.Counter
AS      Count(
          Filter(
            OrderedQuarters,
            UniqueQuarters.Item(
              UniqueQuarters.CurrentOrdinal
            ).Caption = Time.CurrentMember.Caption
          )
        )
MEMBER  Measures.[Sum over Count]
AS      Measures.QuantitySum / Measures.Counter
MEMBER  Measures.AvgQuantity
AS      Avg(
          Time.Years.Members
        , Measures.Quantity
        )
SELECT {Measures.QuantitySum
       ,Measures.Counter
       ,Measures.[Sum over Count]
       ,Measures.AvgQuantity} ON COLUMNS
,       UniqueQuarters        ON ROWS
FROM    SteelWheelsSales

关于mdx - 使用 Mondrian/MDX 按季度分组 : Behavior of Sum and Count vs Avg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29578420/

相关文章:

data-warehouse - 数据仓库与 OLAP 立方体?

sql-server - 为什么我收到此错误 `Error (Data mining): Either the user, TEMP-USER\Administrator, does not have permission` ?

sorting - MDX 按维度排序

performance - 性能较差,消耗分析服务通过 Excel 的表格模型

ssas - 根据 MDX 中的日期获取度量

sql - SSRS/MDX - 从多维数据集提取数据集的表需要一个数据位于 sql 数据库中的列

java - Pentaho 数据源向导

sql-server - Msmdpump.dll OLAP 数据泵抛出 500 错误

sql - Pentaho执行SQL语句变量转换为null

business-intelligence - 我们可以将saiku与Pentaho Analyzer进行比较吗?