MDX Aggregate函数

来源:互联网 发布:卸载加密软件 编辑:程序博客网 时间:2024/05/16 14:34

对于初学者,Aggregate与那些Sum、Count等聚合函数有类似的效果,于是经常有如下疑问:

  1. 他们有什么区别?
  2. 哪种case必须用Aggregate?
  3. 哪种Case Aggregate不能用?

举个销售商品的例子:
DIM_Date(DateID ): 时间维度表
FACT_Sales_Order (DateID ,ItemName ,SalesCount ): 销售事实表

if object_id('DIM_Date') is not null drop table DIM_Dategocreate table DIM_Date(DateID INT  primary key--日期)go--存4个日期的数据 20170101,,2170102,2017010320170104insert into DIM_Dateselect 20170101 union all  select 20170102 union allselect 20170103 union allselect 20170104goif object_id('FACT_Sales_Order') is not null drop table FACT_Sales_Ordergocreate table FACT_Sales_Order(DateID INT,--日期ItemName nvarchar(100),--产品,理论上该列应为INT型的商品维度外键,但这里为了说明Aggregae的用法,就将该列置为nvarchar类型SalesCount INT--销售数量)go--存4个日期的销售数据insert into FACT_Sales_Order  --第一天卖了4样商品select 20170101,N'可口可乐',10 union allselect 20170101,N'口香糖',45 union allselect 20170101,N'雪碧',55 union allselect 20170101,N'面包',3 union all--第二天卖了2样商品select 20170102,N'口香糖',25 union allselect 20170102,N'薯片',15 union all--第三天卖了1样商品select 20170103,N'面包',3  union all--第四天卖了1样商品select 20170103,N'薯片',44go

在Cube里,加了两个度量值,一个是 [Measures].[商品销售样数],一个是[Measures].[商品的销售数量],以下是Cube里这两个度量的设计:
这里写图片描述

总的商品销售样数是5样:口香糖,可口可乐,薯片,雪碧,面包,总的商品的销售数量Sum(SalesCount)是200.
这里写图片描述

假设我们要算第一天和第二天的总商品销售样数 呢?从数据库的记录算应该是5,我们新建一个计算度量[Measures].[第一天和第二天的销售样数] 用Sum方法试下:
这里写图片描述

发现用Sum的原理是遍历第一个参数集合里的每个成员,算第二个参数的度量值,最后做Sum相加,即把第一天20170101的4个样品数(口香糖,可口可乐,雪碧,面包) 加上了第二天20170102的2个样品数(口香糖,薯片),最终相加得出6个,这是不对的,因为第二天的口香糖已经在第一天出现过,不应该算在总数里。

根本原因在于度量 [Measures].[商品的销售样数] 的聚合方式是非重复计数,不是Sum,且也不能用DistinctCount函数解决(MDX中DistinctCount函数是用于对集合去重,而不是对某个度量在某个集合下求非重复计数),这种情况我们只能用Aggregate方法解决,它的定义如下:
Aggregate(set, [,numeric value expression]),
第一个参数也是集合,第二个参数是非计算度量(不能用计算度量)。Aggregate的工作原理是将第一个参数集合中的所有成员按第二个参数度量的聚合方式做聚合,即最终返回结果的聚合方式由第二个参数的度量决定。

正因为聚合方式由第二个参数的度量值决定(说明聚合方式明确),所以第二个参数的度量不能是计算度量,因为计算度量可能由两种不同聚合方式的度量构成,这样SSAS不知道到底用哪种聚合方式,所以干脆就不支持该语法,若你的项目中遇到需要对某个计算度量C(=B+C, B和C都是非计算度量)做Aggregate,那么就将A和B单独用Aggregate处理,最后在做加法即可。

用aggregate修改下我们的例子:

这里写图片描述

现在 [Measures].[第一天和第二天的销售样数] 得到了正确的值5.

到此若对文章开头三个疑问还不清楚的,请从头再看一次该文章.

MDXHelper: IDE to Write, Analyze, Tuning, Debug MDX efficiently.
http://www.mdx-helper.com/
http://blog.csdn.net/bin_520_yan/article/details/77466620

原创粉丝点击