来自群里面讨论的一个问题,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. LINQ学习之旅(五)

    Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 Union All/Union/Intersect操作 适用场景:对两个集 ...

  2. python3安装pip3的方法

    1.点击链接:https://bootstrap.pypa.io/get-pip.py,并下载get-pip.py文件; 2.文件下载完成之后,cd到当前目录,并进行安装,如下: root@zhuzh ...

  3. Codeforces Round #321 (Div. 2) E - Kefa and Watch

    题目大意:给你一个由0-9组成的字符串,有m个询问,两种操作,第一种将l到r的字符全部变成c,第二种问l到r这段 字符串的循环节是不是d. 思路:首先我们要知道怎么判断字符串的循环节的长度是不是d,如 ...

  4. Python Mysql_db对数据查询进行处理

    引用自:https://www.cnblogs.com/itdyb/p/5700614.html 一.脚本如下 #!/usr/bin/python2.7# coding=utf-8import tim ...

  5. 网络流24题 第五题 - PowerOJ1740 CodeVS1905 圆桌问题 二分图多重匹配 网络最大流

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - PowerOJ1740 - 有SPJ - 推荐 题目传送门 - CodeVS1905 - 无SPJ - 0% ...

  6. Unity 中几点注意的地方

    1.面板摆放的规范 2.project工程面板中 文件夹命名的规范,不同类型的东西要分类摆放,例如Script 3.不要留空函数体(系统自动生成Start, Uadate等),空函数体一样会执行,尤其 ...

  7. hdu 2546 饭卡【01背包】

    题目链接:https://vjudge.net/contest/103424#problem/C 饭卡                                Time Limit: 5000/ ...

  8. 算法进阶面试题01——KMP算法详解、输出含两次原子串的最短串、判断T1是否包含T2子树、Manacher算法详解、使字符串成为最短回文串

    1.KMP算法详解与应用 子序列:可以连续可以不连续. 子数组/串:要连续 暴力方法:逐个位置比对. KMP:让前面的,指导后面. 概念建设: d的最长前缀与最长后缀的匹配长度为3.(前缀不能到最后一 ...

  9. websphere 进程

    websphere 监听的是8880端口, 一个server占用300M的内存. 1.查看进程号 >netstat -aon | findstr "8880" TCP 0.0 ...

  10. Ubuntu python Compression requires the (missing) zlib module

    描述: 在Ubuntu中安装setuptools时出现   Compression requires the (missing) zlib module 解决方法步骤: ①Ubuntu下安装zlib: ...