7.1 分组的建立,插入,删除

我们先构建报表,空白模板,示例数据库和sql查询数据源,数据集setOrders,如下

select

CLASSICMODELS.CUSTOMERS.CUSTOMERNAME,

CLASSICMODELS.ORDERS.ORDERNUMBER,

CLASSICMODELS.ORDERS.ORDERDATE,

CLASSICMODELS.ORDERS.STATUS,

CLASSICMODELS.ORDERDETAILS.QUANTITYORDERED,

CLASSICMODELS.ORDERDETAILS.PRICEEACH

from

CLASSICMODELS.CUSTOMERS,

CLASSICMODELS.ORDERS,

CLASSICMODELS.ORDERDETAILS

where

CLASSICMODELS.CUSTOMERS.CUSTOMERNUMBER = CLASSICMODELS.ORDERS.CUSTOMERNUMBER

and

CLASSICMODELS.ORDERS.ORDERNUMBER = CLASSICMODELS.ORDERDETAILS.ORDERNUMBER

我们要先以客户名称分组,再以订单号分组:

那么我们在布局好了普通网格报表之后,在详细行上右击,选择插入分组

首先插入分组grpCustomerName,分组依据CUSTOMERNAME,目录的项目表达式为:row["CUSTOMERNAME"] + ": $(" + row["CUSTOMERTOTAL"].toFixed(2) + ")USD"

3. 设置分组的属性:

� 输入该分组的名称,该名称唯一标识该组,而且该名称会出现在右键菜单“编辑组”当中,您可以非常方便的编辑指定的组。

� 选择分组依据。在下拉框中给您列出了当前表所绑定的所有列,这些列可以不在表中显示。选择数据集上的可用列作为一个分组或者用表达式生成器去构建一个数据绑定作为分组依据

� 设置分组间隔。您可以设置一种分组间隔类型,然后指定分组间隔值。关于如何设置间隔,请参考后面小节“按间隔分组数据”。

� 设置是否要隐藏详细信息。您可以选中该复选框来隐藏表格当中的明细信息,从而只显示组头或组尾的汇总数据。

� 设置目录的项目表达式。项目表达式:指定目录的标题的表达式,可以选择数据集上的可用列作为一个分组或者用表达式生成器去构建一个数据绑定作为分组依据,样式用来指定标题的样式

� 设置排序方向。选择数据分组后,各组按升序还是降序排列。

� 设置分页。您可以设置报表在什么位置分页。如果您想让每组数据都在单独的页面上显示,那么您可以在组之前或之后设置一下分页。

� 设置筛选。您可以添加一个或多个筛选对组中的数据进行筛选。

� 设置排序。您可以设置组内数据的排序。

排序方向:用于指定分组的排序

换页:用于指定换页之后是否重复标题

排序与过滤:用于指定排序的依据和过滤的依据

我们再插入分组grpOrderNumber,分组依据ORDERNUMBER,目录的项目表达式为:"Order Number: " + row["ORDERNUMBER"] + "\n$(" + row["ORDERTOTAL"].toFixed(2) + ")USD"

做适当的布局:

其中:

TOTALSALE绑定:dataSetRow["QUANTITYORDERED"] * dataSetRow["PRICEEACH"]

ORDERTOTAL绑定:Total.sum(row["TOTALSALE"])

CUSTOMERTOTAL绑定:Total.sum(row["TOTALSALE"])

做适当的页面美化,我们就能看到这样的预览效果

7.2 分组的排序与过滤

如果没有添加排序依据,那么就依据默认的排序单选进行排序

如果添加有排序依据,则会覆盖默认的排序依据:

其中,分组的键可以用分组依据,也可以用表达式生成器构建;

方向可以是升序或是降序;

语言环境选自动即可;

排序依据必须是和分组依据一一关联的,不能是多对一,比如本分组不能使用row["ORDERDATE"],否则排序依据失效;

有多个排序依据时则依照sql的排序依据顺序执行;

过滤器:

其中筛选条件中的表达式生成器可以是分组的字段,也可以是表达式生成器生成的

注意的是过滤依据必须是和分组依据一一关联的,不能是多对一,比如本分组不能使用row["ORDERDATE"],否则过滤依据失效;

这样我们就筛选出销售额前3名的客户分组。

我们还可以构建多个筛选条件。

7.3 分组的间隔,聚合,可视性,映射,突出显示,书签

当您创建分组时,BIRT报表默认是按每个分组依据值来分组数据的,比如一个客户名,一个国家名,或者一个日期。在前面我们创建的客户信息表中,BIRT报表将每个国家作为一组,在每组下面列出这个国家所有客户信息。有时按指定的间隔来分组数据更加有用。比如说一张销售报表可以按季度来分组销售数据,而不是按照详细的日期分组。同样您也可以按周或月来分组发货报表,而非按照详细的日期。

比较下面两张报表,第一张将订单信息按详细的日期分组,而第二张报表则按月份来分组订单信息。

通过上面两张报表您可以看到,有些时候设置分组间隔能够更好的组织数据,更加便于用户查看:

� 设置分组间隔可以将很长的报表分隔成为许多短小的,更便于阅读的“块”。

� 设置分组间隔可以对该间隔期的数据进行汇总,更便于分析。

下面给您更加详细的介绍如何设置分组依据为字符串、数值与时间日期的分组间隔

设置字符串的分组间隔

当您设置分组字符串数据的分组间隔时,该分组间隔是一个特定长度的字符串前缀。比如将客户信息按客户名分组,您可以按照客户名的第一个字母,前两个字母等来分组。

一般情况下,报表在显示名字/名称列表时,会按名字/名称的第一个字母来分组。比如一张客户信息表,我们会将客户信息按它们名称的第一个字母来分组,名称以A 开头的客户分为一组,以B 开头的客户分为一组,以此类推。您还可以设置多个字母间隔来对字符串分组,来将那些名称里面包含多个特定字母的前缀按这个前缀分组。比如一个产品名称中,可能开头两个字母表示供应商,如ME, MO 等,那么我们就可以按前两个字母前缀来对产品名称分组。下面就是我们按一个字母前缀、两个字母前缀、三个字母前缀来对客户名称分组的例子。

设置字符串分组间隔

1. 首先按前面小节中介绍的步骤来创建分组,分组依据为字符串类型。

2. 在间隔中设置“前缀”,

3. 在“区域”中设置需要按前几个字符作为前缀来对字符串分组。

我们建立数据集customer:

select CLASSICMODELS.CUSTOMERS.CUSTOMERNAME,CLASSICMODELS.CUSTOMERS.CONTACTLASTNAME,CLASSICMODELS.CUSTOMERS.PHONE,CLASSICMODELS.CUSTOMERS.ADDRESSLINE1,CLASSICMODELS.CUSTOMERS.CITY,CLASSICMODELS.CUSTOMERS.STATE,CLASSICMODELS.CUSTOMERS.COUNTRY,CLASSICMODELS.CUSTOMERS.CREDITLIMIT

from CLASSICMODELS.CUSTOMERS

当您对数值数据分组时,您也可以设置分组间隔。比如您制作订单信息表时,当订单号为数值型时,可以按订单号每50 个、100 个、1000 个等来分组。

在设置数值数据的分组间隔时,您需要考虑该数值的范围来设定这个间隔。如果数值的范围从100 至200,那么分组间隔可以设置为10;如果数值范围从100 至1000 时,那么分组间隔可以设置为100。

下图给您显示了数值数据按 10、100 和1000 间隔来分组的例子:

在您设置了数值数据的分组间隔后,BIRT报表是按照数据返回的第一个值来计算并分组的。比如第一个数值是1070,如果您设置的分组间隔是10,那么第一组数据则是1070-1079,第二组数据是1080 至1089,以此类推。在上图的例子中当分组间隔为1000 时,您可以看到2005 和2030 也被分在了第一组中,因为您数值的第一个值是1070。在很多情况下这可能不是您想要的结果。

前面说到,BIRT报表是按照返回数据的第一个值作为基准值来计算并分组的。当然您可以设置这个基准值。您可以在分组时设置分组间隔的基数,让BIRT报表用您设置的值来作为基数来计算分组。下图就是设置分组间隔基数与否的区别:

设置数值数据的分组间隔

1. 按照前面小节的步骤创建分组。

2. 在间隔中选择“间隔”对数值设置分组间隔。

3. 在区域中设置分组间隔数值,如10,100 等。

4. 如果您需要指定分组间隔的基数,那么选中“对间隔使用固定基值”复选框,并在下面的输入框中输入该基值。

5. 点击“确定”,预览报表结果。下图就是我们对订单信息表按照订单号来分组,并将分组间隔设置为10 的结果:

当您设置日期时间数据的分组间隔时,您可以把日期以小时、天、周、月、年为间隔进行分组。设置日期时间数据的分组间隔对于按时间显示的信息来说非常有帮助,比如我们常见的日报、周报、月报、季度报、年报等。

下图给您展示了按日期分组,分别以周、月、季度为分组间隔的报表。每周从周一开始,每月从当月的第一天开始,季度分别从1 月1 日至1 月31 日,4 月1 日至6 月30 日,7月1 日至9 月30 日,10 月1 日至12 月31 日。如果您以年为分组间隔,则从一年的1 月1 日至当年的12 月31 日为一组。

如果您不想使用BIRT报表日期时间数据的默认分组间隔,您可以指定自己的分组基值与间隔区域。比如一个企业的财年是从10 月1 日至次年的9 月30 日,那么您在统计近10 年该企业的财务年报时,则可以基于自己的年报起止日期来设定分组,而非使用日历意义上的年报设置。比如您可以设置分组基值为1999 年10 月1 日,分组间隔为年,那么BIRT报表就会将1999 年10 月1 日至2000 年9 月30 日分为第一组,2000 年10 月1 日至2001 年9 月30 日为第二组,以此类推。

设置日期时间的分组间隔

1. 按照前面小节介绍的步骤创建分组,分组依据为日期时间类型。

2. 选择分组间隔,您可以选择秒、分钟、小时、天、周、月、季度和年。

3. 在“区域”中设置一个数值,指定每多少间隔作为一组。比如您选择分组间隔为周,区域数值设置为2,那么BIRT报表就会每2 周的数据作为一组。

4. 如果您需要设置分组的基值,那么选中“对间隔使用固定基值”,并在下面输入区域中设置基值。

5. 点击“确定”,预览报表结果。下图是对客户订单信息按日期分组,并设置分组间隔为月的结果。

许多报表一个比较普遍的特性就是需要显示一些汇总或聚合信息。比如一张销售报表需要显示销售总额:按产品的销售额,按地区的销售额等;平均销售额;最高或最低销售额。而前面章节我们已经创建了一些简单的带有汇总信息的报表,比如按国家分组并带有客户数量汇总的客户信息表,按日期分组并带有订单数量汇总的订单信息表。汇总信息通常是对某些数据行中的数据进行计算的结果。对于一个简单列表型的报表,聚合计算是作用在整个报表的数据行上的。比如下图这张客户信息表就在最后加入了一个对客户数量的总计。

在上面的例子中,BIRT报表通过对报表中所有客户名称的计数来统计客户数量。除了可以对报表中所有数据进行汇总外,您还可以对每个分组的数据进行汇总。比如下面这个例子:

上面例子中的报表将客户信息按国家分了组,除了对所有客户数量进行汇总意外,还对每个组内的客户数量进行了汇总。

BIRT报表中的汇总是通过聚合计算来实现的,而BIRT报表提供了类型丰富的聚合计算函数,最常用的有AVE(), COUNT(), COUNTDISTINCT(), SUM()等。您可以查阅BIRT报表帮助文档来获取这些函数的信息。

一般情况下,我们会在表格的表页眉行、表页脚行,以及组页眉行、组页脚行放置聚合数据。当然您也可以在明细行放置聚合数据,但是一般情况下我们不会放置前面提到的那些常用函数,如AVG(),COUNT(),SUM()等,因为同一分组内各明细行的聚合数据都是重复的。一般我们在明细行会放置runningSUM(),movingAVG()等聚合函数,这样会比较有意义,因为这些函数只对当前明细行以前的数据进行聚合。下面我们就来创建一张客户订单详情表,它按客户来统计每个客户的订单信息。表中既有SUM()又有runningSUM()聚合,其中累计订购额为runningSUM()计算而得,而每个订单的订购额与客户的订购额则由SUM()计算而得。

您可以按以下步骤来显示上面例子的聚合数据:

1.首先您先设计出一张列表型报表,其中包括客户名称,订单号,产品编号,订购数量,订购单价与订购金额。其SQL 查询语句如下:

select c.customerName,o.orderNumber,productCode,quantityOrdered,priceEach,

(quantityOrdered*priceEach) as orderPrice from customers as c, orders as o, orderdetails as od where c.customerNumber = o.customerNumber and o.orderNumber=od.orderNumber

该报表运行结果如下图所示:

2. 在表格最右边添加一列,将表头设置为“累计订购额”。

3. 选中表格中的明细数据行,按“客户名称”对数据进行分组gCustomer,然后再选中明细数据行,再按“订单编号”进行分组gOrderNumber。此时报表设计文件应该如下图所示:

4. 在明细数据行,累计订购额列,从Palette 拖入一个聚合元素。

5. 在弹出的“聚合生成器”窗口中,输入名称,设置数据类型为浮点,选择函数为RUNNINGSUM,表达式为row[“ORDERPRICE”],聚合条件为组gOrderNumber。这样BIRT报表在生成每一行明细数据时,会对截至当前数据行且同一订单号分组下的订购额进行汇总。

6. 在订单号分组与客户分组的组页脚中分别添加一个聚合,数据类型为浮点,聚合函数为SUM,表达式为row[“ORDERPRICE”],聚合条件分别为组gOrderNumber 与组gCustomer。BIRT报表将会在每个订单组与客户组后面加上该组的订单额总计。

7. 在表页脚添加一个聚合,数据类型为浮点,聚合函数为SUM,表达式为row[“ORDERPRICE”],聚合条件为表。BIRT报表将会在报表最后加上所有订单额的总计。

8. 调整报表外观格式,此时报表设计如下图所示:

9. 预览报表结果,观察RUNNINGSUM 与SUM 的区别。

七、BIRT分组报表相关推荐

  1. oracle系统报表开发工具,掌握七款实用报表开发工具,定制属于自己的报表

    阅读提示: 文章中与FineReport软件使用的相关内容,基于软件的V7.0旧版本编写,不代表软件最新的使用方式. FineReport最新版免费试用:https://www.finereport. ...

  2. 解决 Birt 等报表工具制作报表的几个难题

    解决Birt等报表工具制作报表的几个难题 在上一篇<Birt 如何实现不规则月份统计>中,我们讲解了如何帮助 Birt 制作这种报表的详细过程,在本文中我们再继续讨论几个类似的制作难题,并 ...

  3. 使用多级分组报表展现分类数据

    使用多级分组报表展现分类数据 当你走进便利店,你会发现所有的商品都是按类排放的,分类排放可以帮助您快速找到同类商品,也可以快速发现你想要的商品. 当去饭店吃饭的时候,菜单上的菜也是按类别排列的,比如凉 ...

  4. 如何在分组报表中实现组内数据补空行及组内页码

    在对报表数据进行打印时,经常会要求进行精确打印,比如一张纸能打印 20 行数据,如果超过就分页,如果不满 20 行,则在数据下方进行补够空行.这种情况最常见于银行对账信息等明细数据的打印.同时,在某些 ...

  5. 皕杰报表中的过滤分组函数与过滤分组报表

    过滤分组报表是什么样的呢?见下图. 从图中可以看出,"华北"组中的一部分记录被过滤,并单独拎出来在"其中:北京"组和"其中:天津"组中进行了 ...

  6. 轻松搞定分组报表中的各种排序

    在做分组报表统计时,我们经常会被要求按照数据升序或降序排序.在 group 函数的参数中,我们可以指定分组后对组的排序表达式,这样报表展现时能够直接根据该表达式进行排序了.我们先来看一个简单的例子,如 ...

  7. Smartbi电子表格设计企业报表(一)——中国式报表(分组报表)

    课时05:电子表格设计企业报表--中国式报表(分组报表)

  8. 中国式复杂报表:按段分组报表制作对比(润乾 vs 帆软)

    概述 报表是用表格.图表等格式来展现数据的工具,不仅格式多样,其中数据更是要体现出动态的效果.其中,分组报表是常见的一种类型,包括按区域.产品类别.客户.年度.季度.月份等不同条件分组. 上图是一个典 ...

  9. 如何制作动态层分组报表

    润乾报表提供了单元格同值合并的功能,可以实现动态层次的分组报表.这里通过一个例子来说明使用过程. 目标报表: 需要根据参数动态传递分组字段,按不同维度汇总订单运货费.如参数输入"货主地区, ...

最新文章

  1. JVM运行时结构、Java内存管理、JVM实例、HotSpot VM对象的创建、内存布局和访问定位
  2. Iterator接口介绍
  3. adf时间作用域_ADF:在任务流终结器中支持bean作用域
  4. Google推出了Python最牛逼的编辑器,不看后悔一辈子!
  5. 六种异常处理的陋习(转自http://www.blogjava.net/freeman1984/archive/2007/09/27/148850.html)...
  6. 团队第一阶段站立会议05
  7. android view 存值,使用ViewModel保存数据
  8. 【sklearn第二十一讲】矩阵分解问题
  9. SEO搜索引擎优化二十八条经验建议
  10. java的注解定义map_java – MapStruct:丰富映射注释以定义自定义映射器
  11. NLP 的巨人肩膀(下):从 CoVe 到 BERT
  12. android6最新版本,安卓版“AirDrop”发布,安卓6版本以上都能用!
  13. PHP加密扩展库Mcrypt
  14. 【云和恩墨业务介绍】之 SQL 审核服务
  15. 【毕业季】在校生怎么看待毕业季?
  16. 3.4.3 Electric Fence电网 USACO(毕克定理) USACO
  17. C语言计算5+55+555+5555+55555
  18. Remoting简单实例[]
  19. 8051单片机实战分析(以STC89C52RC为例) | 06 - 动态数码管驱动
  20. 化学中的机器学习方法1

热门文章

  1. Android Studio中src/main/res/values中strings.xml文件中字符串使用
  2. lego-loam代码分析(1)-地面提取和点云类聚
  3. [2019红帽杯]easyRE writeup
  4. 哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛)K
  5. Python实现FLV视频拼接
  6. 访问boost::variant std::variant
  7. C++算法篇 模拟算法
  8. 优化页面的方法——6种
  9. 如何减少电脑内存占用或优化内存?
  10. 计算机管理员被隐藏,怎么隐藏管理员账户?隐藏管理员账户的操作方法