作者·2010-04-26 09:37
·

SSAS2005/2008中自定义MDX语句模板的使用

字数 9143阅读 2534评论 1赞 1

MDX语句的编写不但需要具有多维度思考的能力并了解上下文处理方式,而且因为成员名称的冗长而显得复杂。在SQL Server Management Studio及SQL Server Business Intelligence Development Studio中 ,附带了用于许多常见任务的模板,但是模板的真正作用在于它能为必须频繁创建的复杂脚本创建自定 义模板。

在本练习中,您将创建带有较少参数的简单MDX脚本模板(除法脚本,处理了除数为零或空的情况),但是模板也适用于较长的重复MDX脚本及其他类型的脚本(如存储过程等)。

1.创建自定义模板

1)在模板资源管理器中,展开“分析服务器模板”,右键单击模板树中任意位置,指向“新建”,再单

击“MDX模板”;

2)键入“MDX除法模板”作为新模板名称,再按 Enter 键;

3)右键单击“MDX除法模板”,再单击“编辑”。

4)在“连接到Analysis Service”对话框中,查看连接信息,再单击“连接”。

5)在查询编辑器中,键入以下脚本以实现处理了除数为零或除数为空的除法脚本模板:

        --除法模板(处理了除数为0、为空的情况)

        -- =============================================

        IIF(

            (

                IsEmpty( )

                OR

                =0

            ),

            NULL,       

            (

                ( )

                /

                ( )

            )

        )

 

      SQL Server Management Studio 提供的模板脚本包含了可以帮助您自定义代码的参数。模板参数定义将使用格式 ,其中:

parameter_name 是脚本中参数的名称。

data_type 是参数的数据类型。

      在此示例中: 代表除数,类型是mdx变量;

代表被除数,类型也是mdx变量;

     在定义MDX查询时使用“替换模板参数”对话框可以将值插入到脚本中,从而快速生成合法的MDX脚本片断。

2. 测试自定义模板

     1)在SQL Server Management Studio的MDX查询语句编辑器中(或者在SQL Server Business Intelligence Development Studio的计算成员编辑器代码窗口视图中),将“除法脚本”拖放到工作区中的对应位置;

     2)在主菜单的“查询”菜单中,单击“指定模板参数的值”菜单项。

     3)在“替换模板参数”对话框中,为value_clause 值键入 “[Measures].[销售毛利]”(不包含分号),为divisor_clause 值键入 “[Measures].[销售收入]”;

     4)再单击“确定”关闭“替换模板参数”对话框,则系统并脚本编辑器中自动生成计算“销售毛利率”的MDX语句。

  3.小节

     

    通过此方法,在使用SSAS中可逐渐积累,为频繁执行的任务创建自定义模板,并将自定义脚本组织模板文件夹中,可以形成常见任务的自定义脚本库。

附录A:自定义模板,对指定的表达式进行前期比较,并生成文字论断

--=======================================

-- 上期比较陈述   

    MEMBER [Measures].[当期] AS

        ()

    MEMBER [Measures].[上期] AS

        ([Measures].[当期],[时间].[Fiscal].CurrentMember.PrevMember)

    MEMBER [Measures].[增长率] AS

        IIF(

                (

                    IsEmpty([Measures].[上期])

                    OR

                    [Measures].[上期]=0

                ),

                NULL,       

                (

                    ([Measures].[当期]-[Measures].[上期])

                    /

                    ([Measures].[上期])

                )

        )

    MEMBER [Measures].[增长陈述] AS       

        CASE

            WHEN

                [Measures].[增长率]=0

                THEN

                    '与上月基本持平'

            WHEN

                [Measures].[增长率]>0

                THEN 

                    VBA!Format(VBA![abs]([Measures].[增长率]) ,'比上月增加0.00%')

            WHEN

                [Measures].[增长率]<0

                THEN

VBA!Format(VBA![abs]([Measures].[增长率]),'比上月减少0.00%')

        END

--=============================================

附录B:自定义模板,简单比较分析陈述模板

--=======================================

 MEMBER [Measures].[<陈述名称,mdx_string,>] AS 

  CASE

   WHEN [Measures].[<原指标名称,mdx_string,>]

    >  

    [Measures].[<参照指标名称,mdx_string,>] THEN

    '比<参照系描述,mdx_string,>增加'+VBA![Format](

     [Measures].[<原指标名称,mdx_string,>]

     -

     [Measures].[<参照指标名称,mdx_string,>]

     ,"#.##")

   WHEN [Measures].[<原指标名称,mdx_string,>]

    <

    [Measures].[<参照指标名称,mdx_string,>] THEN

    '比<参照系描述,mdx_string,>减少'+VBA![Format](

     [Measures].[<参照指标名称,mdx_string,>]

     -

     [Measures].[<原指标名称,mdx_string,>]

     ,"#.##")

   

   ELSE

    '与<参照系描述,mdx_string,>基本持平'

  END

--=============================================

附录C:自定义模板,求指定指标的去年平均值

--=======================================

--求指标去年平均值

 

AVG(

 DESCENDANTS(

    ANCESTOR([时间].[Fiscal].CurrentMember,[时间].[Fiscal].[年]).PrevMember,

    [时间].[Fiscal].[月度]

 ),

 [Measures].[库存台数]

)

--=============================================

附录D:自定义模板,求指定指标的前N期值

--=======================================

 --求指标在指定级别上的前N同期值

MEMBER [Measures].[<metric_short_name,mdx_name,>上<timespan_N,mdx_int,><level_short_name,mdx_name,>同期值]

AS

 (

  PARALLELPERIOD(

   [时间].[Fiscal].[<level_short_name,mdx_name,>],

   <timespan_N,mdx_int,>,

   [时间].[Fiscal].CurrentMember   

  ),

  [Measures].[<metric_short_name,mdx_name,>]

 )

--=============================================

附录E:自定义模板,对指定指标的分段统计考察对象在各段内的数量

--=======================================

WITH

 SET tempSet AS

  <segment_set,mdx_set_def,>

 MEMBER [Measures].[<segment_Low_name,string,>] AS

  Count(Filter(

    tempSet,

    <metric_name,mdx_name_def,>

     <

     <segment_Low_bound,double,>

     )

  )

 

 MEMBER [Measures].[<segment_Middle_name,string,>] AS

  Count(Filter(

    tempSet,

    <metric_name,mdx_name_def,>

     >=

     <segment_Low_bound,double,>

     AND <metric_name,mdx_name_def,>

      <

      <segment_High_bound,double,>

   )

  )

 

 MEMBER [Measures].[<segment_High_name,string,>] AS

  Count(Filter(

    tempSet,

    <metric_name,mdx_name_def,>

    >=

    <segment_High_bound,double,>

   )

  )

 

SELECT

 {

  [Measures].[<segment_Low_name,string,>],

  [Measures].[<segment_Middle_name,string,>],

  [Measures].[<segment_High_name,string,>]

 } ON 0

 

FROM

 [<cube_name,string,>]

WHERE

 (<where_def,mdx_tuple,>)

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Mr_JBean/archive/2009/02/13/3884952.aspx

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论1 条评论


2012-01-18 08:26
谢谢分享
Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广