微软BI 之SSRS 系列 - 在 Cube 中通过 MDX 查询实现基于父子递归关系的汇总报表
2013-12-23 18:00
691 查看
之前我写了一篇在 SSRS 开发中处理这种父子关系的汇总与聚合的文章 (SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表),示例中的查询是基于 SQL Server 关系型数据库的,这一篇是基于 MDX 父子维度的 SSRS 报表。
沿用上一篇中的 (SSAS系列 - 关于父子维度的设计)父子维度 和(SSAS 系列 - 自定义的日期维度设计) 的时间维度,并在此基础上创建 Cube 并部署。
当然在这个例子中可能不会使用到时间维度,之所以添加进来只是因为在 Cube 的创建过程中 SSDT 开发工具会提示:不要创建只含有一个维度的多维数据集。
部署完成之后,我们可以通过 MDX 查看一下相应的维度和度量值数据。
但是像这样显然不够,因为我们不仅仅需要知道我们应该查询的不光是当前成员,而且应该展现当前成员的后代子成员。
并且通过 Dimension 属性来定义要获取到这些成员的 MEMBER_CAPTION (在父子维度设计的那篇文章已经提到了), 成员的唯一名称 MEMBER_UNIQUE_NAME,父成员的唯一名称 PARENT_UNIQUE_NAME, 层次结构中的级别 LEVEL_NUMBER。
每一个成员的后代子成员都会被查询出来,这里只展现部分数据。
如何创建报表和连接 SSAS 分析服务数据库,以及如何创建基于 SSAS MDX 查询的 Dataset 在这里就不再说了,可以参考我的这篇文章。
设计好报表并拖放好一个 Table 组件,指定好 Employees 和 Sales Amount 列。
选中 Employees 这一行,右键编辑 Group 属性。
在这里注意分组的属性并不是 Employees 而是它的维度属性 Employees.UniqueName 。
递归父类也是使用的维度属性 Employees.ParentUniqueName 。
可以根据名字或者 Sales Amount 排序,这里选择的是 Employees 。
设置显示和隐藏是根据点击 Employees 决定的。
设置 Employees 名称的 Textbox 属性,根据级别高低来决定左边距的缩进距离。
=Cstr(Level() * 20) & "pt"
为了显示不同的级别的背景,也可以手动的设置行背景,粗略的设置了一下颜色,实际开发中可以精心设置。
=Switch(LEVEL()=0,"LightSlateGray",LEVEL()=1,"LightSteelBlue",LEVEL()=2,"LightBlue",LEVEL()=3,"LightCyan",LEVEL()=4,"Azure",LEVEL()=5,"White")
保存并预览报表的效果,虽然是基于 Cube 的 MDX 查询,但是实现起来也比较容易。
可以对比一下之前通过数据仓库直接查询的父子递归实现的 SSRS 报表,数据上都是正确的。
更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。
沿用上一篇中的 (SSAS系列 - 关于父子维度的设计)父子维度 和(SSAS 系列 - 自定义的日期维度设计) 的时间维度,并在此基础上创建 Cube 并部署。
当然在这个例子中可能不会使用到时间维度,之所以添加进来只是因为在 Cube 的创建过程中 SSDT 开发工具会提示:不要创建只含有一个维度的多维数据集。
部署完成之后,我们可以通过 MDX 查看一下相应的维度和度量值数据。
SELECT ([Measures].[Sales Amount]) ON COLUMNS, NON EMPTY([Employee].[Employees].Members) ON ROWS FROM [BIWORK_ParentChildDemo]
但是像这样显然不够,因为我们不仅仅需要知道我们应该查询的不光是当前成员,而且应该展现当前成员的后代子成员。
并且通过 Dimension 属性来定义要获取到这些成员的 MEMBER_CAPTION (在父子维度设计的那篇文章已经提到了), 成员的唯一名称 MEMBER_UNIQUE_NAME,父成员的唯一名称 PARENT_UNIQUE_NAME, 层次结构中的级别 LEVEL_NUMBER。
SELECT NON EMPTY { [Measures].[Sales Amount]} ON COLUMNS, NON EMPTY { ( DESCENDANTS( [Employee].[Employees].ALLMEMBERS ) ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME, PARENT_UNIQUE_NAME, LEVEL_NUMBER ON ROWS FROM [BIWORK_ParentChildDemo]
每一个成员的后代子成员都会被查询出来,这里只展现部分数据。
如何创建报表和连接 SSAS 分析服务数据库,以及如何创建基于 SSAS MDX 查询的 Dataset 在这里就不再说了,可以参考我的这篇文章。
设计好报表并拖放好一个 Table 组件,指定好 Employees 和 Sales Amount 列。
选中 Employees 这一行,右键编辑 Group 属性。
在这里注意分组的属性并不是 Employees 而是它的维度属性 Employees.UniqueName 。
递归父类也是使用的维度属性 Employees.ParentUniqueName 。
可以根据名字或者 Sales Amount 排序,这里选择的是 Employees 。
设置显示和隐藏是根据点击 Employees 决定的。
设置 Employees 名称的 Textbox 属性,根据级别高低来决定左边距的缩进距离。
=Cstr(Level() * 20) & "pt"
为了显示不同的级别的背景,也可以手动的设置行背景,粗略的设置了一下颜色,实际开发中可以精心设置。
=Switch(LEVEL()=0,"LightSlateGray",LEVEL()=1,"LightSteelBlue",LEVEL()=2,"LightBlue",LEVEL()=3,"LightCyan",LEVEL()=4,"Azure",LEVEL()=5,"White")
保存并预览报表的效果,虽然是基于 Cube 的 MDX 查询,但是实现起来也比较容易。
可以对比一下之前通过数据仓库直接查询的父子递归实现的 SSRS 报表,数据上都是正确的。
更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。
相关文章推荐
- 微软BI 之SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表
- 微软BI 之SSRS 系列 - 基于时间段参数的 MDX 查询以及时间日历 Date Picker 的时间类型参数化
- SSRS 系列 - 使用带参数的 MDX 查询实现一个分组聚合功能的报表
- 微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换
- 微软BI 之SSRS 系列 - 如何在 MDX 查询中获取有效的 MEMBER 成员属性作为参数传递
- 微软BI 之SSRS 系列 - 实现 Excel 中图表结合的报表设计
- 微软BI 之SSRS 系列 - 如何实现报表导航 Navigation 和钻取 Drill Down 的效果
- 微软BI 之SSRS 系列 - 使用 LookupSet 和 Adjacent Group 等高级技巧在报表中跨 Dataset 分组查询
- 微软BI 之SSRS 系列 - 如何让报表在一页显示,两种常用的技巧
- 通过Mybatis拦截器巧妙实现通用查询打破实体与字段对应关系
- 微软BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
- 微软BI 之SSRS 系列 - 报表邮件订阅中 SMTP 服务器匿名访问与 Windows验证, 以及如何成功订阅报表的实例
- MySQL部门或菜单父子节点递归实现树查询
- 通过Mybatis拦截器巧妙实现通用查询打破实体与字段对应关系
- .Net 分页实现系列之三---基于有查询条件的分页的方式 (1-13 11:38)
- START WITH CONNECT BY PRIOR子句实现递归查询,主要用于查询数据中的树型结构关系[父子关系]
- 通过存储过程实现报表复杂查询并以Excel格式输出
- 微软BI 之SSAS 系列 - 实现Cube 以及角色扮演维度,度量值格式化和计算成员的创建
- 基于ssh2框架下多表查询的单个模块开发。其中的页面跳转是通过MVC中的ModelandView实现的。
- 通过存储过程实现报表复杂查询并以Excel格式输出