我正在尝试对季度组进行汇总(总和和平均值),但根据我使用的方法,我会得到不同的结果。我想知道为什么。
以下基本查询说明了我的数据(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] 度量给了我想要的结果,但我并不完全满意:
- [QuantitySum] 通过 Sum 显式计算。我希望隐式计算它,因为它已经在多维数据集中定义为总和聚合度量
- 我正在 [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/