zoukankan      html  css  js  c++  java
  • 发布一个关于统计时间段的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 [用户和行为简单分析]

  • 相关阅读:
    征战蓝桥 —— 2016年第七届 —— C/C++A组第5题——消除尾一
    UVA 10410 Tree Reconstruction (树重建)
    UVA 12166 Equilibrium Mobile (修改天平)(dfs字符串表示的二叉树)
    UVA 1600 Patrol Robot (巡逻机器人)(bfs)
    UVA 712 STrees(S树)
    UVA 536 Tree Recovery (二叉树重建)
    Stall Reservations【贪心】【堆】
    Sunscreen【贪心】
    Sunscreen【贪心】
    Sunscreen【贪心】
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/694289.html
Copyright © 2011-2022 走看看