来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现?
 
SSRS 2008、2008RS,2012 中实际上没有这种对应的控件,我们通常想到的方式可能是上方一个单独的 Chart 图,下方一个 Table 然后合并在一起。但是这样会存在一些问题,因为 Chart 轴的值不是固定的,会随着聚合值的增加而扩展。并且对于表中的列头来说也没有办法完全能够和 Chart X 轴上的坐标对应在一条竖线上,一定会有偏差。
 
在 SSRS 中,我们可以通过一些技巧来实现类似于这样的效果。下面是我用 Column Chart 来展现的这种类似于 Excel 中的效果,虽然实现比较接近了,但我并不推荐这么做! 因为我们完全可以通过合理的变通,并使用其它的方式将这些数据展现的更加合理!  
 
原始测试数据 (AdventureWorksDW2012)就是一个简单的查询 - 
SELECT DPC.EnglishProductCategoryName,
FIS.OrderDate,
FIS.OrderDateKey,
DD.CalendarYear,
FIS.SalesOrderNumber,
FIS.SalesOrderLineNumber,
FIS.SalesAmount AS Internet_Sales
FROM FactInternetSales AS FIS
INNER JOIN DimProduct AS DP
ON FIS.ProductKey = DP.ProductKey
INNER JOIN DimProductSubcategory AS DPS
ON DP.ProductSubcategoryKey = DPS.ProductSubcategoryKey
INNER JOIN DimProductCategory AS DPC
ON DPS.ProductCategoryKey = DPC.ProductCategoryKey
INNER JOIN DimDate AS DD
ON FIS.OrderDate = DD.FullDateAlternateKey

新建报表和数据集 Dataset,选择 Matrix 行分组为 Product Category ,列分组为 Calendar year。

 
添加两个新行 - 选择 Outside Group - Above。
并删除第一行。
删除的时候只删除行,但是不要连组给删除了。
删除之后的样子就是这样的。
第二行是表头要显示的年份,第一行用作行内 Column Chart 图。
在第一行的这个位置插入 Data Bar,选择 Stacked Column。
 
填充 Stacked Column 中的聚合值,分组以及系列。
填充完毕后就可以看到大致的效果了,每一列都是从 Matrix 列分组展开的,而每一列当中的 Column Chart 的分组又依赖于当前的列分组中的年份。
自行做一些美化工作,包括格式化等等。
存在一个问题,不同的系列是出来了,但是无法区分各个系列与产品分类的关系。
思路是 - Chart 图中的颜色模板使用自定义的,然后使用自定义函数获取指定的颜色,这几种颜色需要和自定义模板中的颜色是一样的。
Private colorPalette As String() = {"SeaGreen", "Orange", "RoyalBlue"}
Private count As Integer =
Private mapping As New System.Collections.Hashtable() Public Function GetColor(ByVal groupingValue As String) As String
If mapping.ContainsKey(groupingValue) Then
Return mapping(groupingValue)
End If Dim c As String = colorPalette(count Mod colorPalette.Length)
count = count +
mapping.Add(groupingValue, c)
Return c
End Function

报表的自定义函数。

 
设置 Stacked Column 图的自定义模板颜色。
 
选中 English Product Category 文本框,设置它的背景颜色,调用函数。
=Code.GetColor(Fields!EnglishProductCategoryName.Value)
最后,要做出这种效果还需要进一步的格式化,调整边框等操作使得这个 Stacked Column 像一个整体,而非单一的个体,这些美化的细节就不一一描述了。可以参考 天善学院微软SSRS2012报表课程 基础案例中的 - 案例6,案例13,案例18,案例24 以及 SSRS 报表设计提高篇中的报表美化与设计等案例。所以本文只讲解实现的流程,过于细节的设计技巧,包括一些聚合分组的概念,自定义函数等不是本文的重点。
对于文章开头看到的这种 Line Chart 形式可不可以做,也可以做,可以通过调整 Chart 区域折线的平面宽度使得几个独立的折线区域也连接成一个整体。但是像最左侧的 Y 轴线如何实现,几个产品不使用底线区分而要求使用 Chart 中自带的系列又该显示且不重复?这些都不是拖拖拽拽就可以实现的,这需要熟练掌握 SSRS 报表中的各种知识点和技能点,不同控件的组合使用技巧等。当然,如果就这个案例来说,假设实际开发中如果是我,我会拒绝设计这种样子的报表,因为上图很明显在阅读性和数据呈现上完全体现不出来像 Excel 展现出来的那种效果。
 
所以,在实际报表开发过程中,不能为了模仿而模仿,因为很有可能模仿成一个四不像。
 
吐吐口水吧! 在实际项目中,在引导客户改变已有使用习惯,适应新的适应习惯的过程中往往确实是伴着口水,Fighting 的,包括遭受到客户对自身能力的怀疑,这些在项目开发中都是很正常的。像有很多客户往往会提出他们认为很好实现但实则很难实现的一些效果要求必须实现,这些极端情况也是客观存在的。对于我来说,我也会遇到一些变态的和不合理的需求,但通常情况下我也会直接拒绝,坦诚告诉客户无法实现,因为它已经违背了 SSRS 自身特性。但同时我也会尝试拿出另多的替代的解决方案让客户来选择,这样客户通常会比较容易接受和妥协。就像出门从北京到上海出差,告诉他们飞机确实因为技术原因就是不能飞,在客户非要证明但又无法证明飞机就是能起飞的同时给他们选择高铁,汽车和自行车三选一,一般情况下客户还是会从中选择他最能够接受的一种最优方案,因为谁也耗不起时间。

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)

如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。


微软BI 之SSRS 系列 - 实现 Excel 中图表结合的报表设计的更多相关文章

  1. 微软BI 之SSRS 系列 - 在 Cube 中通过 MDX 查询实现基于父子递归关系的汇总报表

    之前我写了一篇在 SSRS 开发中处理这种父子关系的汇总与聚合的文章 (SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表),示例中的查询是基于 SQL Server 关系型 ...

  2. 微软BI 之SSIS 系列 - 在 SSIS 中导入 ACCESS 数据库中的数据

    开篇介绍 来自 天善学院 一个学员的问题,如何在 SSIS 中导入 ACCESS 数据表中的数据. 在 SSIS 中导入 ACCESS 数据库数据 ACCESS 实际上是一个轻量级的桌面数据库,直接使 ...

  3. 微软BI 之SSRS 系列 - 如何实现报表导航 Navigation 和钻取 Drill Down 的效果

    开篇介绍 如何在 SSRS 报表中实现标签导航 Navigation 和向下钻取 Drill Down的效果? 如同下面这个例子一样 - 在页面第一次加载的时候,默认显示是全部地区的销售总和情况,上面 ...

  4. 微软BI 之SSRS 系列 - 基于时间段参数的 MDX 查询以及时间日历 Date Picker 的时间类型参数化

    今天在天善问答里看到一个问题,如果我没有理解错的话,它应该是指比如在一个报表中选取一个时间段,然后求出这个时间段的某个 Measure 的 SUM 和.并且同时求出这两个时间点对应的上一年的时间点之间 ...

  5. 微软BI 之SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表

    基于父子关系的递归结构在公司组织结构里比较常见,基本上都是在一张表里实现的自引用关系.在报表中如果要实现这种效果,并且在这个基础上做一些数据的汇总,可以使用到下面提到的方法. 要实现的效果大致如下 - ...

  6. 微软BI 之SSRS 系列 - 报表邮件订阅中 SMTP 服务器匿名访问与 Windows验证, 以及如何成功订阅报表的实例

    这篇文章源于在上一篇博文中有园友提出订阅 SSRS 报表时的一个问题,  于是就好好总结了一下,把有关 SSRS 报表订阅的要点和容易出现问题的地方写出来,希望对大家有所帮助! 参看上一篇博文 - S ...

  7. 微软BI 之SSRS 系列 - 巧用 RunningValue 函数在分组中排序并设置 RANK 排名

    开篇介绍 经常有像类似于这样的排序需求,以及设置分组下的排序序号.比如此图中要求城市 City 在省份下按照 Internet Sales Amount 总销售额进行排序,并标识在各省份下的排名. 实 ...

  8. 微软BI 之SSRS 系列 - 如何在 MDX 查询中获取有效的 MEMBER 成员属性作为参数传递

    这篇小文章的来源是 天善问答,比如在报表中要根据点击某一个成员名称然后作为参数传递给自身报表或者下一张报表,这个在普通的 SQL 查询中没有任何问题.但是在 MDX 中查询是有区别的,比如在 MDX ...

  9. 微软BI 之SSRS 系列 - 解决Pie Chart 中控制标签外部显示与标签重叠的问题

    当 Pie Chart 页面标签过多的时候,往往数字标签内容挤做一团.我们要做的是:第一,让标签在饼图外部显示:第二,不让标签重叠. 一种做法是通过修改数字标签属性 - Series Label Pr ...

随机推荐

  1. SPLAY,LCT学习笔记(三)

    前两篇讲述了SPLAY模板操作,这一篇稍微介绍一下SPLAY的实际应用 (其实只有一道题,因为本蒟蒻就写了这一个) 例:bzoj 1014火星人prefix 由于本蒟蒻不会后缀数组,所以题目中给的提示 ...

  2. DDD领域模型之分配权限(十三)

    权限分配和权限查找. 在DDD.Domain工程中新建:BAS_PermissionAssign类 public partial class BAS_PermissionAssgin:Aggreate ...

  3. SqlServer基础语法(三)

    1.数据库备份的方法: 完整数据库备份GPOSDB 文件大小:23MB 日志备份 GPOSDB日志备份文件大小:211KB --完整备份 Backup DATABASE GPOSDB To disk= ...

  4. 浅析微信支付:公众平台卡券功能开通、HTML5线上发券(JS-SDK接口)、查看卡券详情

    本文是[浅析微信支付]系列文章的第十六篇,主要讲解如何使用微信公众平台的卡券功能.如何使用HTML5在网页展示用户领券以及微信卡券和商户平台代金券的关系. 浅析微信支付系列已经更新十六篇了哟-,没有看 ...

  5. Redis的优势和特点

    Redis的特点: 内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的key-value类型的数据,同时还提供list ...

  6. Struts2中的数据处理的三种方式对比(Action中三种作用域request,session,application对象)

    1:在Action中如何获得作用域(request,session,application)对象: 取得Map(键值对映射集)类型的requet,session,application; 对数据操作的 ...

  7. SpringAOP学习第一天 @Pointcut注解

    自从上班之后,就很少再看AOP相关的内容,几年时间里虽然也有一两次完整看过,一直没有机会用到,都忘记了.今天重温一下 TestNG测试类 package com.test.spring.aop.min ...

  8. Spring3.X jdk8 java.lang.IllegalArgumentException

    异常提示: javax.servlet.ServletException: Servlet.init() for servlet springMVC threw exception org.apach ...

  9. mydumper下载安装

    下载地址   https://github.com/maxbube/mydumper [root@gg ~]#cd mydumper [root@gg mydumper]# cmake . -bash ...

  10. How to cast List<Object> to List<MyClass> Object集合转换成实体集合

    List<Object> list = getList(); return (List<Customer>) list; Compiler says: cannot cast  ...