发布一个关于统计时间段的MDX语句

发布一个关于统计时间段的MDX语句
折腾俩小时才写出来,先贴代码,再说原理,虽然看似简单,但知识点也不少,解决过程很曲折(我说我哦)。
WITH MEMBER mydate as now()
SELECT {[Measures].[到达用户数]} on COLUMNS,
 {StrToMember("[日期天].[日期天].[月].&[" + Format(dateadd('m',-5,cdate(mydate)), "yyyymm") + "]"):strtomember("[日期天].[日期天].[月].&["+cstr(mydate)+"]")} on ROWS
from [用户和行为简单分析]

意图:要统计某月到某月这个时间段内用户到达数的情况,其中“[日期天]”是维度,“[Measures].[到达用户数]”是度量值,“[日期天].[日期天].[月]”是统计月的层次结构,“[用户和行为简单分析]”是多维数据集(立方体)。
解决过程及知识点:
1、首先MDX里不能像t-sql那样使用DECLARE语句来声明变量,需要使用WITH来定义一个计算成员。第一行便是声明了一个mydate的计算成员。注意在MDX里的变量和标量和在SQL里一样,是弱类型的。但当你声明一个字符串的变量的话应该用双引号扩住,而不是单引号,而你要声明一个日期型的变量的话不用引号,比如声明一个表示2003年5月的日期型变量用“WITH MEMBER mydate as 200305”就可以了。当然了这是一个最简单的计算成员,计算成员还可以是一个复杂的层次级别表达式,详细请参考以下链接
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/mdxref9/html/c4507149-e67b-4e5d-9192-cc911acd9adc.htm

2、MDX里可以把一个字符串表达式转换成一个成员或者集的引用,StrToMember函数用来完成讲字符串转换成成员,然后这个字符串你可以用报表参数或者内部计算成员等来拼接而成,从而达到动态查询的效果。

3、MDX里并没有很多的日期和文本处理函数,但它却可以用大部分的VBS函数和EXCEL表达式,实际上是调用的Micrisoft.VisualBasic命名空间下的相关类,以及其它的一些对象。比如在MDX里获取当前时间,就不能用getdate(),而用now()或者date()。而dateadd函数的里的格式字符串,如yyyy,m,d等字符串要用单引号或双引号扩住,否则这个函数执行不过去的。注意在t-sql里是不用加引号的,如SELECT DATEADD(mm, 2, getdate())

4、虽然MDX是弱类型的,但有时候也需要强制类型转换,因为mydate变量声明的时候是日期类型,但后面要用它拼接成一个成员的字符串表达式,所以直接用还不行,要用vb的CStr()函数来转换类型。

5、在MDX里同样一个标识符,两边加上大括号和不加大括号是不一样的。不加有时候只是一个级别或者层次,加上有时候就相当于给这个层次执行Member函数,就是相当于这个层次标识符后面加上一个".Members",它就成了一个集了。

以上都是我个人总结的,含有一定猜的成份,大家不要完全相信哦,接触BI没多长时间,好多概念不熟悉,大家看的时候不要以完全信任的心态去看,毕竟是菜鸟的总结,但我的结果肯定是对的,虽然过程比较曲折吧,至少参考我的思路可以解决一些其它相似的MDX问题,因为大家对VBS和EXCEL一般还是很熟悉的。

modify by wawa at 2007.3.31

更正一下哦,上面那语句可能出不来正确结果,我现在改成下面这样了,计算某年从1月到现在每个月的情况,format格式出来的月份没有前导的零,我汗,而且在MDX里声明日期格式也不能用“WITH MEMBER mydate as 200305”,上面是我错了,日期目前我发现只能用now,不指点日期怎么来表示,这个帖子以后我得到答案后更新一下。

WITH MEMBER mydate as dateadd("m",9,now())
SELECT {[Measures].[到达用户数],[Measures].[活跃用户数]} on COLUMNS,
 {StrToMember("[日期天].[日期天].[月].&[" + cstr(year(mydate))+"01" + "]"):strtomember("[日期天].[日期天].[月].&["+cstr(year(mydate))+iif(len(cstr(month(mydate)))<>1,cstr(month(mydate)),"0"+cstr(month(mydate)))+"]")} on ROWS
from [用户和行为简单分析]

posted @ 2007-03-30 17:40  蛙蛙王子  Views(5984)  Comments(7Edit  收藏  举报