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