之乎者也,阿弥陀佛

软件设计的原则就是,化繁为简,化难为易,把人的思维集中在简单的领域,然后通过有序的组合实现复杂的逻辑。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
今天的项目需要用数据仓库的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,对其函数要精通

才行,这样才能应对复杂多变的需求
posted on 2010-01-20 00:55  搏击的小船  阅读(829)  评论(0编辑  收藏  举报