今天的项目需要用数据仓库的MDX来获取数据,项目的基本已经做完了,比较了一下原来用sql写的
方法,数据仓库真是方便,并且相对简单的多,当然,首先是要熟练MDX语法才行,因为刚接触数
据仓库,语句虽然写出来了,但是还是有很多不熟悉的,特此总结一下。
项目的需求很简单,根据查询条件,条件中包括年,月,显示前11个月的计划销售量和实际销售量
和总的销售量,如2009年,6月,显示从2008年7月,到2009年6月每个月的销量和到6月为止的总计划
量和销量。
以前用sql写,麻烦在这前11个月的处理,要定义12个时间变量,通过时间函数dateadd()取得真实的时
间,显示的时候要通过case判断,还要对不同等级的客户进行group by显示
,一共写了100多行的sql,现在用MDX,20几行就搞定了,写完的MDX如下:
with member [Measures].[year_quantity] as
sum([date].[月份].&[2009-01-01T00:00:00]:[date].[月份].&[2009-06-01T00:00:00],[Measures].
[Month_Quantity])
member [Measures].[year_plan] as
sum([date].[月份].&[2009-01-01T00:00:00]:[date].[月份].&[2009-06-01T00:00:00],[Measures].
[Month_Plan_Quantity])
member [Measures].[quantity_rate] as
[Measures].[year_quantity]/[Measures].[year_plan]*100
member [Measures].[year_expense] as
sum([date].[月份].&[2009-01-01T00:00:00]:[date].[月份].&[2009-06-01T00:00:00],[Measures].
[Expense_Amount])
select {
[Measures].[year_plan],[Measures].[year_quantity]
,[Measures].[quantity_rate],[Measures].[year_expense]
,[Measures].[Year_Acti_Number],[Measures].[Month_Quantity]
,[Measures].[前一月进货量],[Measures].[前二月进货量]
,[Measures].[前三月进货量],[Measures].[前四月进货量]
,[Measures].[前五月进货量],[Measures].[前六月进货量]
,[Measures].[前七月进货量],[Measures].[前八月进货量]
,[Measures].[前九月进货量],[Measures].[前十月进货量]
,[Measures].[前十一月进货量]
} on 0
,non empty(
([cust_grade].[cust_grade].[cust_grade],[cust_grade].[Cust_Grade_Name].[Cust_Grade_Name])
*([cust].[Cust].[Cust],[cust].[Cust_Name].[Cust_Name])
*([cust].[City].[City],[cust].[City_Name].[City_Name])
) on 1
from [医院销售分析]
where ([月份].&[2009-06-01T00:00:00]:[月份].&[2009-06-01T00:00:00]
,[material].[Material].[Material].&[BM00000001]
,[subcompany].[organ].[organ].&[BG00000020]
,[office].[organ].[organ].&[BG00000074]
,[salesman].[Personnel].&[DJ00001495])
上面的MDX有几个注意的地方:
1.时间的区间表示:[date].[月份].&[2009-01-01]:[date].[月份].&[2009-06-01]
从开始时间到结束时间用冒号[:]连接。
2.Sql中有with来临时存储数据,MDX中用with member来临时存储。
3.MDX语句中,where中不能显示此前已经出现的维度。
数据仓库MDX的语法和sql有很大的不同,增加了许多函数,要想熟练应用MDX,对其函数要精通
才行,这样才能应对复杂多变的需求