动态格间运算

1 占比、比值、同期比

Ⅰ占比报表

第一步:定义数据源ds1,如下:

SELECT 订单明细.单价,订单明细.数量,订单.货主地区 FROM 订单,订单明细 WHERE 订单.订单ID = 订单明细.订单ID 

第二步:设计表样,定义表达式

其中:

A2单元格输入表达式:=ds1.group(货主地区.false),设置为纵向扩展

B2单元格输入表达式:=ds.count()

C2单元格输入表达式:=b2/b3,设置为百分数格式,并保留2位小数

D2单元格输入表达式:=ds.sum(数量*单价),设置为人民币格式,并保留2位小数

E2单元格输入表达式:=d2/d3,设置为百分数格式,并保留2位小数

B3单元格输入表达式:=sum(b2{})

D3单元格输入表达式:=sum(d2{}),设置为人民币格式,并保留2位小数

第三步:保存预览

注意

这是一个比较简单的行间运算例子,该例子要求报表引擎在解析报表时,能够先解析表达式,判断出B2格和D2格的占比表达式用到了B3格和D3格,从而先计算B3格和D3格,然后再计算C2格和E2格。

对于很多引用第三方表达式解析器(如BeanShell)的报表工具来说,就无法智能的判断运算优先级了。因此,对于那类报表工具来说,看起来很简单的占比报表,实现起来却很麻烦。

Ⅱ 比值报表

第一步:定义数据源ds1,如下所示:

SELECT EMPLOYEE.EMPNAME,订单明细.数量,订单明细.单价  
  FROM EMPLOYEE,订单,订单明细 WHERE 订单.订单ID = 订单明细.订单ID AND EMPLOYEE.EMPID = 订单.雇员ID

第二步:设计表样,定义表达式

其中:

A2单元格输入表达式:= &B2,左主格设置为C2

B2单元格输入表达式:=ds1.Group(EMPNAME,false,,,sum(数量*单价),true),左主格设置为A0,并设置为纵向扩展。

C2单元格输入表达式:=ds1.sum(数量*单价),设置为人民币格式,并保留2位小数

D2单元格输入表达式:=c2[1]-c2,设置为人民币格式,并保留2位小数

第三步:保存预览

注意

这个例子中用到了绝对层次坐标和根格的概念。

Ⅲ 环比上期

第一步:定义数据源ds1,如下所示:

 SELECT  订单.订购日期,订单明细.单价,订单明细.数量 FROM 订单,订单明细 WHERE 订单.订单ID = 订单明细.订单ID AND 订单.订购日期 is not null

第二步:设计表样,定义表达式

其中:

A2单元格输入表达式:=ds1.group(year(订购日期),false),设置为纵向扩展

B2单元格输入表达式:=ds1.group(month(订购日期),false) ,并设置为纵向扩展。

C2单元格输入表达式:=ds1.sum(数量*单价),设置为人民币格式,并保留2位小数

D2单元格输入表达式:=C2/C2[-1] ,设置为数字百分比格式,并保留2位小数

第三步:保存预览

注意

这个例子中用到了位移坐标的概念,并且采用了坐标缺省表示法。练习:如果不采用坐标缺省表示法该如何实现?答案如下:

Ⅳ 同比上期

把刚才的例子进一步深化,刚才的例子只是当前月与紧邻的上个月的数据的环比,如果要与上一个年度的同一个月的数据进行对比该如何做呢? 做法如下:

其中:

E2单元格输入表达式:=C2/C2[A2:-1]{B2=$B2} ,设置为数字百分比格式,并保留2位小数

第三步:保存预览

注意

这个例子中用到了位移坐标的概念,并且采用了坐标缺省表示法; 还用到了$运算符,$运算符的书写规则如下:$Cellx,其含义是在格集表达式中指代当前格的Cellx主格(请培训人员在此讲解几个使用$运算符的例子以加深理解)

2 累积 、分组汇总、条件汇总

Ⅰ累积报表

第一步:定义数据源,如下所示:

ds1:SELECT  EMPLOYEE.EMPID,EMPLOYEE.EMPNAME,EMPLOYEE.SEX,EMPLOYEE.DEGREE,EMPLOYEE.BONUS  FROM EMPLOYEE
ds2:SELECT  DEGREE.ID,DEGREE.NAME FROM DEGREE

第二步:设计表样,定义表达式

其中:

A2单元格输入表达式:=ds1.Select(EMPID,false,,toint(EMPID)),设置为纵向扩展

B2单元格输入表达式:=ds1.EMPNAME

C2单元格输入表达式:=ds1.SEX,显示值表达式为:=if(@value=="1","男","女")

D2单元格输入表达式:=ds1.DEGREE,显示值表示设置为:=ds2.getone(NAME,ID==@value)

E2单元格输入表达式:=ds1.BONUS,设置为人民币格式,并保留2位小数

F2单元格输入表达式:= e2+f2[-1] ,设置为人民币格式,并保留2位小数

第三步:保存预览

Ⅱ 分组汇总

分组汇总与统计我们在前面讲述分组报表的时候已经讲过了,这里给大家一定的时间再次温习一下《入门教程-分组式报表》中的第3节,为我们下面要讲的条件汇总做好准备。

Ⅲ 条件汇总

第一步:定义数据源,如下所示:

ds1:SELECT DEPT,SEX,  DEGREE, BONUS, EMPNAME FROM EMPLOYEE where dept in (1,3)
ds2:SELECT  DEGREE.ID,DEGREE.NAME FROM DEGREE
ds3:SELECT DEPT.DEPTID,DEPT.DEPTNAME FROM DEPT

第二步:设计表样,定义表达式

其中:

A3单元格输入表达式:=ds1.group(DEPT),显示值表示设置为:= ds3.getone(DEPTNAME,DEPTID==@value),设置为纵向扩展

B3单元格输入表达式:=ds1.group(DEGREE) ,显示值表示设置为:= ds2.getone(name,id==@value) ,设置为纵向扩展。

C3单元格输入表达式:= ds1.select(EMPNAME) ,设置为纵向扩展

D3单元格输入表达式:=ds1.BONUS,设置为人民币格式,并保留2位小数

D4单元格输入表达式:= sum(D3{}) ,设置为人民币格式,并保留2位小数

D5单元格输入表达式:= sum(D3{}) ,设置为人民币格式,并保留2位小数

D6单元格输入表达式:= count(D3{D3>10000})

第三步:保存预览

注意

这个例子中用到了单元格集合的概念,一个单元格的扩展集合的书写形式如下:

Cellx[层次坐标或者位移坐标]{条件表达式}

例如:

sum(D3{})  表示求D3单元格集合中所有单元格的数值之和

count(D3{D3>10000}) 表示是统计D3单元格集合中数值高于10000的个数

3 排名、序号、孤立格运算

Ⅰ 排名

组内排名

第一步:定义数据源ds1,如下所示:

SELECT  订单.货主地区,订单.货主城市,订单明细.单价,订单明细.数量  FROM 订单,订单明细  WHERE 订单.订单ID  = 订单明细.订单ID

第二步:设计表样,定义表达式

其中:

A2单元格输入表达式:=ds1.group(货主地区),设置为纵向扩展

B2单元格输入表达式:=ds1.group(货主城市) ,设置为纵向扩展。

C2单元格输入表达式:=ds1.sum(单价*数量) ,设置为人民币格式,并保留2位小数

D2单元格输入表达式:=rank(C2,C2[A2]{})

第三步:保存预览

组间排名

如果统计排名时不光统计每一地区内的排名,还要统计总的排名,该如何做呢?

第一步:在最后增加一列,如下图所示:

第二步:为E2定义表达式如下:

E2单元格输入表达式:=rank(C2,C2[A0]{})

第三步:保存预览

注意

这个例子中用到了扩展单元格集合的概念,各位想想如果不用排名函数,有没有其他方式能实现组内、组间排名呢?答案是肯定的,可以考虑用count函数来实现排名,具体做法如下:

用count(C2[A2]{C2>$C2})+1来代替rank(c2,C2[A2]{})

用 count(C2[A0]{C2>$C2})+1来代替rank(c2,C2[A0]{})

可见只要熟练掌握了扩展的思想,以及扩展出来的单元的获取方式,就可以很灵活的进行处理。

Ⅱ 序号

组内序号

第一步:定义数据源ds1,如下所示:

SELECT  订单.货主地区,订单.货主城市,订单明细.单价,订单明细.数量  FROM 订单,订单明细  WHERE 订单.订单ID  = 订单明细.订单ID

第二步:设计表样,定义表达式

其中:

A2单元格输入表达式:=&C2 ,左主格设置为c2

B2单元格输入表达式:=ds1.group(货主地区) ,左主格设置为A0,设置为纵向扩展。

C2单元格输入表达式:=ds1.group(货主城市) ,设置为纵向扩展

D2单元格输入表达式:=ds1.select(单价)

D2单元格输入表达式:=ds1.数量

第三步:保存预览

Ⅲ 孤立格运算

第一步:定义数据源ds1,如下:

SELECT  订单.货主地区,订单明细.数量,订单明细.单价  FROM 订单,订单明细  WHERE 订单明细.订单ID  = 订单.订单ID 

第二步:设计表样,定义表达式

其中:

A2单元格输入表达式:=ds1.group(货主地区,true) ,设置为纵向扩展

B2单元格输入表达式:= ds1.count()。

C2单元格输入表达式:= rank(b2,b2[a0]{})

D2单元格输入表达式:= ds1.sum(单价 * 数量)

E2单元格输入表达式:=rank(d2,d2[a0]{})

B4单元格输入表达式:= sum(D2{E2<=3})

E4单元格输入表达式:= B4/sum(D2{})

第三步:保存预览