一个关于查询动态时间的MDX语句
目的分析:在特定的查询展示环境下,如要利用BSM发布KPI指标的信息,由于登陆门户时需要每天实时的数据信息,但是又不需要另外开发程序来辅助生成,只能通过MDX语句来查询,通过查找mdx中的函数,没有找到可以动态去时间的相关函数。在MDX里也不能像t-sql那样使用DECLARE语句来声明变量,需要使用WITH来定义一个计算成员。第一行便是声明了一个mydate的计算成员。注意在MDX里的变量和标量和在SQL里一样,是弱类型的。但当你声明一个字符串的变量的话应该用双引号扩住,而不是单引号,而你要声明一个日期型的变量的话不用引号,比如声明一个表示2007年8月的日期型变量用“WITH MEMBER mydate as 200708”就可以了。
MDX里可以把一个字符串表达式转换成一个成员或者集的引用,StrToMember函数用来完成讲字符串转换成成员,然后这个字符串你可以用报表参数或者内部计算成员等来拼接而成,从而达到动态查询的效果。MDX里并没有很多的日期和文本处理函数,但它却可以用大部分的VBS函数和EXCEL表达式,实际上是调用的Micrisoft.VisualBasic命名空间下的相关类,以及其它的一些对象。比如在MDX里获取当前时间,就不能用getdate(),而用now()或者date()。而dateadd函数的里的格式字符串,如yyyy,m,d等字符串要用单引号或双引号扩住,否则这个函数执行不过去的。注意在t-sql里是不用加引号的,如SELECT DATEADD(mm, 2, getdate())。虽然MDX是弱类型的,但有时候也需要强制类型转换,因为mydate变量声明的时候是日期类型,但后面要用它拼接成一个成员的字符串表达式,所以直接用还不行,要用vb的CStr()函数来转换类型。
在MDX里同样一个标识符,两边加上大括号和不加大括号是不一样的。不加有时候只是一个级别或者层次,加上有时候就相当于给这个层次执行Member函数,就是相当于这个层次标识符后面加上一个".Members",它就成了一个集了。
1、统计昨日的销售额
WITH MEMBER mydate as now()
SELECT {[Measures].[销售额]} on COLUMNS,
{StrToMember("[时间维].[日].&[" + Format(DateAdd('d',-1,CDate(mydate)), "yyyy年MM月dd日") + "]")} on ROWS
from [产品销售专题]
也可以写成:
WITH MEMBER mydate as now()-1
SELECT {[Measures].[销售额]} on COLUMNS,
{StrToMember("[时间维].[日].&[" + Format(mydate, "yyyy年MM月dd日") + "]")} on ROWS
from [产品销售专题]
2、统计最近三个月的销售额(这个也可以用mdx的函数实现)
WITH MEMBER mydate as now()
SELECT {[Measures].[销售额]} on COLUMNS,
{StrToMember("[时间维].[月].&[" + Format(DateAdd('m',-2,CDate(mydate)), "yyyy年MM月") + "]"):StrToMember("[时间维].[月].&["+ Format(mydate, "yyyy年MM月") +"]")} on ROWS
from [产品销售专题]
参考:http://www.cnblogs.com/onlytiancai/archive/2007/03/30/694289.html