19

SSAS2005及SSAS2008中自定义MDX查询语句模板的使用

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,>)

VN:F [1.9.13_1145]
Rating: 0.0/10 (0 votes cast)

相关文章:

  1. 复杂或有趣的MDX问题求解(1)-多个相关列参与求加权平均值
  2. 复杂或有趣的MDX问题求解(4)- 求过去12个月的销售总额
  3. 一些常用的MDX查询语句(示例基于SSAS2005/SSAS2008)
  4. XML for Analysis(XMLA)开发详解-(4)XMLA over TCP/IP访问Analysis Services 2005/2008 Olap的释疑
  5. 复杂或有趣的MDX问题求解(3)-SQL查询事实表与MDX语句查询的关系示例

当前没有评论!

第一个在本文留言。

发表评论

名字(必须)
邮箱(必须),(永不被公布)
网址(建议)

字体为 粗体 是必填项目,邮箱地址 永远不会 公布。

允许部分 HTML 代码:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
URLs(网站链接)必须完整有效 (比如: http://www.bi-professional.com),所有标签都必须完整的关闭。

超出部分系统将会自动分段及换行。

请保证评论内容是与日志或 Blog 内容相关的,灌水、攻击性或不恰当的评论 可能 会被编辑或删除。