1. 概述
1.1 学习视频
本文的学习视频如下,如果您需要由浅入深地学习层次坐标可以使用:层次坐标专题
1.2 应用场景
实际场景中,层次坐标写起来会很复杂,公式维护起来也麻烦。
为了解决这样一个影响报表开发效率的问题,FineReport 将一些计算常见指标的公式做成了函数,这样不用再去手写公式,极大提高您的报表开发效率。
2. CIRCULAR
2.1 说明
CIRCULAR 函数用于 循环引用,循环引用是指当一个单元格内的公式直接或间接地引用了这个公式本身所在的单元格。
下面表格中的公式写法都是在 B2 单元格插入公式,而公式里面又引用了 B2 单元格,故为循环引用。
扩展方向 | 公式写法 | 等价于 |
---|---|---|
纵向扩展 | CIRCULAR(A2 , B2 , C2 , D2) | IF(&A2 = 1, 0, B2[A2:-1] - C2[A2:-1] + D2[A2:-1]) |
横向扩展 | CIRCULAR(B1 , B2 , B3 , B4 , false) | IF(&B1 = 1, 0, B2[;B1:-1] - B3[;B1:-1] + B4[;B1:-1]) |
注1:CIRCULAR 函数的循环引用是写死的,参与运算固定 4 个参数,算是一个特定场景才能用的函数。
注2:横向扩展时需要加第五个参数 false,这个不能遗漏。
2.2 示例
例如一个出入库统计的场景:
可以使用该函数计算上日库存,每天的上日库存是:昨天的上日库存+( 入库-出库 ),如下图所示:
2.3 模板
已完成模板可参见:
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Coordinate\CIRCULAR纵向扩展.cpt
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Coordinate\CIRCULAR横向扩展.cpt
点击下载模板:
3. CROSSLAYERTOTAL
3.1 说明
CROSSLAYERTOTAL 用于计算 跨层累计,跨层累计是指每层都对数据进行累计求和,且支持跨分组继续累计。
如果用层次坐标来写跨层累计公式又长又复杂,所以直接做成了一个函数,极大节省了开发工作量。
扩展方向 | 公式写法 | 等价于 |
---|---|---|
纵向扩展 | CROSSLAYERTOTAL(A1, B1, C1, D1) | IF(&B1 >1, D1[B1:-1] + C1, D1[A1:-1,B1:!-1] + C1) |
注:CROSSLAYERTOTAL 暂不支持横向扩展。
3.2 示例
例如统计 2020 年国家部分能源产量的场景:
使用该函数对所有产量数据进行每层累计求和,即跨分组时可以继续累计,如从汽油跨到煤油可以继续累计,效果如下图所示:
3.3 模板
已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Coordinate\CROSSLAYERTOTAL纵向扩展.cpt
点击下载模板:CROSSLAYERTOTAL纵向扩展.cpt
4. HIERARCHY
4.1 说明
HIERARCHY 用来表示 相对层次坐标,可以理解成相对层次坐标的简化写法。
纵向扩展时函数里面如果不写偏移值,那么默认就是 -1。但是横向扩展时不支持,必须把公式写全,写法如下表:
扩展方向 | 公式写法 | 等价于 |
---|---|---|
纵向扩展 | HIERARCHY(A1) | A1[A1:-1] |
HIERARCHY(A1, B1) | B1[A1:-1] | |
HIERARCHY(A1, B1, +2) | B1[A1:+2] | |
横向扩展 | HIERARCHY(B1, B1, -1, false) | B1[;B1:-1] |
HIERARCHY(B1, B2, -1, false) | B2[;B1:-1] | |
HIERARCHY(B1, B2, +2, false) | B2[;B1:+2] |
4.2 示例
例如多个纵向扩展单元格的场景:
函数对应的相对层次坐标输出结果如下图所示:
4.3 模板
已完成模板可参见:
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Coordinate\HIERARCHY纵向扩展.cpt
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Coordinate\HIERARCHY横向扩展.cpt
点击下载模板:
5. LAYERTOTAL
5.1 说明
LAYERTOTAL 用于计算 逐层累计,逐层累计是指每层都对数据进行累计求和,跨组时重新累计,也就是每个组分别进行累计。
同样如果用层次坐标来写逐层累计公式又长又复杂,所以直接做成了一个函数,极大节省了开发工作量。
扩展方向 | 公式写法 | 等价于 |
---|---|---|
纵向扩展 | LAYERTOTAL(B1, C1, D1) | D1[B1:-1] + C1 |
横向扩展 | LAYERTOTAL(B2, B3, B4, fasle) | B4[;B2:-1] + B3 |
5.2 示例
例如统计 2020 年国家部分能源产量的场景:
使用该函数可以对每种能源的产量数据分别逐层累计求和,即跨分组时会重新累计,如从汽油跨到煤油会重新开始累计,效果如下图所示:
5.3 模板
已完成模板可参见:
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Coordinate\LAYERTOTAL纵向扩展.cpt
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Coordinate\LAYERTOTAL横向扩展.cpt
点击下载模板:
6. MOM
6.1 说明
MOM 用于计算 环比,环比是指将连续两个统计周期的数据相比,同样使用函数简化环比计算公式的书写。
纵向扩展时函数里面如果不写偏移值,那么默认就是 -1。但是横向扩展时不支持,必须把公式写全,写法如下表:
扩展方向 | 公式写法 | 等价于 |
---|---|---|
纵向扩展 | MOM(A1, B1) | IF(&A1 > 1, B1 / B1[A1:-1],0) |
MOM(A1, B1, -2) | IF(&A1 > 1, B1 / B1[A1:-2],0) | |
横向扩展 | MOM(B2, B3, -1, false) | IF(&B2 > 1,B3 / B3[;B2:-1],0) |
6.2 示例
例如统计 2020 年国家部分能源产量的场景:
使用该函数计算每种能源各季度产量的环比,如汽油 2 季度产量跟 1 季度产量相比,环比不能跨组这点需要注意。
6.3 模板
已完成模板可参见:
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Coordinate\MOM纵向扩展.cpt
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Coordinate\MOM横向扩展.cpt
点击下载模板:
7. PROPORTION
7.1 说明
PROPORTION 用于计算 占比,占比指的是每个数据占数据总和的比率。
扩展方向 | 公式写法 | 等价于 |
---|---|---|
纵向扩展 横向扩展 | PROPORTION(A1) | A1/sum(A1[!0]) |
7.2 示例
例如统计 2020 年全国交通客运量场景:
使用该函数计算每个月份客运量站全年总客运量的占比,如下图所示:
7.3 模板
已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Coordinate\PROPORTION.cpt
点击下载模板:PROPORTION.cpt
8. SORT
8.1 说明
SORT 用于对数据量大小进行 排名。
扩展方向 | 公式写法 | 等价于 |
---|---|---|
纵向扩展 横向扩展 | 降序:SORT(A1) | COUNT(UNIQUEARRAY(A1[!0]{A1 > $A1}))+1 |
升序:SORT(A1, false) | COUNT(UNIQUEARRAY(A1[!0]{A1 < $A1}))+1 |
8.2 示例
例如统计 2020 年全国交通客运量场景:
使用该函数对每个月的客运量大小进行降序排名,如下图所示:
8.3 模板
已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Coordinate\SORT.cpt
点击下载模板:SORT.cpt