微软BI 之SSRS 系列

摘要:
SSRS2008、2008RS,2012中实际上没有这种对应的控件,我们通常想到的方式可能是上方一个单独的Chart图,下方一个Table然后合并在一起。在SSRS中,我们可以通过一些技巧来实现类似于这样的效果。填充StackedColumn中的聚合值,分组以及系列。可以参考天善学院微软SSRS2012报表课程基础案例中的-案例6,案例13,案例18,案例24以及SSRS报表设计提高篇中的报表美化与设计等案例。
来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现?
微软BI 之SSRS 系列第1张
SSRS 2008、2008RS,2012 中实际上没有这种对应的控件,我们通常想到的方式可能是上方一个单独的 Chart 图,下方一个 Table 然后合并在一起。但是这样会存在一些问题,因为 Chart 轴的值不是固定的,会随着聚合值的增加而扩展。并且对于表中的列头来说也没有办法完全能够和 Chart X 轴上的坐标对应在一条竖线上,一定会有偏差。
在 SSRS 中,我们可以通过一些技巧来实现类似于这样的效果。下面是我用 Column Chart 来展现的这种类似于 Excel 中的效果,虽然实现比较接近了,但我并不推荐这么做! 因为我们完全可以通过合理的变通,并使用其它的方式将这些数据展现的更加合理!
微软BI 之SSRS 系列第2张
原始测试数据 (AdventureWorksDW2012)就是一个简单的查询 -
SELECTDPC.EnglishProductCategoryName,
    FIS.OrderDate,
    FIS.OrderDateKey,
    DD.CalendarYear,
    FIS.SalesOrderNumber,
    FIS.SalesOrderLineNumber,
    FIS.SalesAmount ASInternet_Sales
FROM FactInternetSales ASFIS
INNER JOIN DimProduct ASDP
ON FIS.ProductKey =DP.ProductKey
INNER JOIN DimProductSubcategory ASDPS
ON DP.ProductSubcategoryKey =DPS.ProductSubcategoryKey
INNER JOIN DimProductCategory ASDPC
ON DPS.ProductCategoryKey =DPC.ProductCategoryKey
INNER JOIN DimDate ASDD
ON FIS.OrderDate = DD.FullDateAlternateKey

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

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

报表的自定义函数。

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

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

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


免责声明:文章转载自《微软BI 之SSRS 系列》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇foreach 循环遍历 以及函数的应用OBJ格式模型详细介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

小程序加入echart 图表

github上的地址 https://github.com/ecomfe/echarts-for-weixin 复制到当前项目根目录下 添加展示bar图表例子的文件夹  index.json 中配置使用的组件,以及组件的位置 这一配置的作用是,允许我们在 pages/bar/index.wxml 中使用 <ec-canvas> 组件。注意路径...

c++之标准库iomanip

C++ 标准库之iomanip istream & istream::get(char *, int, char = ‘ ’); istream & istream::getline(char *, int, char = ‘ ’); 作用: 从文本中提取指定个数的字符串, 并在串数组末尾添加一个空字符. 区别: get() 不从流中提取终...

使用C#和Excel进行报表开发-生成统计图Chart

    原文地址:http://www.opent.cn/a/094/1235.shtml     有的Web项目选用Excel作为报表方案,在服务器端生成Excel文件,然后传送到客户端,由客户端进行打印。在国内的环境下,相对PDF方式,Excel的安装率应该比pdf阅读器的安装率要高,同时,微软也为C#操作Excel提供了完备的接口,虽然ZedGrap...

iReport5.6.0 linechart 制作方法

iReport 官网和文档上关于chart设计以饼图和JDBC源作为样例。但很多其它的情况下因为报表中的数据须要首先加工处理,因此很多其它的是从JavaBeans set datasource从获取数据,另外linechart也是使用非常多的一种chart工具,本文就记录在iReport中通过JavaBeansset datasource 获取数据,继而...

chart.js使用常见问题

Chart.js是一个简单、面向对象、为设计者和开发者准备的图表绘制工具库。 在使用过程中新手可能会遇到很多问题导致图标无法显示。下面我们来看一下在使用过程中可能会遇到的问题。 刚开始用chart.js的新手可能最先使用的就是chart.js的中文文档,根据中文文档所写的操作步骤完成操作。 首先,下载chart.js文件,通常我们从github下载。 初...

QT5的QChart使用记录

如果需要在QT中使用QChart类,需要在安装的时候勾选QChart选项,在工程的 .pro 文件里面添加 QT += charts 语句,包含 QChart 头文件就行了。 对于图表的显示,可以先拖出来一个控件,比如 widget、Graphics等控件,将其提升为 QChartView 类用于显示 chart。右键该控件选择提升,输入内容可以以图片中的...