1. 概述
在线视频学习请查看:层次坐标。
如果公式很难理解,可以先学习层次坐标的进阶视频,吃透公式的基本概念和使用方法:层次坐标进阶。
1.1 应用场景
在学习了 层次坐标 后,便可以将层次坐标和公式函数结合,来进行动态格间运算,比如进行比较、占比、环比、逐层累计、跨层累计、条件汇总等。
1.2 功能简介
传统报表工具,一般只提供同行内的格间运算和针对某组(或全体)的集合运算,会有如下几种情况的不足:
跨行运算,如:引用上一行数据,典型应用就是做累计比和环比。
跨组运算,如:同期比等等,跨组则无能为力。
集合运算,只提供个别固定的函数,如:取第一名、算累计值等。
无法组合出通用集合运算,如:取第二名、算累计的乘积等。
某些带条件的运算,如:统计同组数据中比当前数大的个数,也就是数据排名等。
FineReport 使用层次坐标表达扩展单元格的位置,很好地解决了以上动态格间运算的问题。
本文通过示例介绍如何使用层次坐标书写计算表达式来进行动态格间运算。
2. 示例一
2.1 预期效果
效果如下图所示:
字段名 | 公式 |
---|---|
比较 | 比较=本期应付金额-01月份的应付金额 将单元格扩展出的每个值与第一个值进行比较,示例中为求差值。 |
占比 | 占比=本期应付金额/所有月份应付金额 计算单元格扩展出的每个值在总量中占据的比例。 |
环比 | 计算每行数据与上一行数据的比率。 环比(发展速度)=本期应付金额/上期应付金额 |
2.2 数据准备
新建数据集 ds1,数据库查询对话框中写入 SQL 查询语句:
SELECT STRFTIME('%m',订购日期) AS 月份,应付金额
FROM 订单
WHERE STRFTIME('%Y',订购日期)='2011'
如下图所示:
2.3 报表设计
按照表格中的说明设计报表。
1)A1~E1 单元格依次写入字段标题名:月份,应付金额,比较,占比,环比。选中 A1~E1 单元格,设置标题预定义样式为 Head类型,如下图所示:
2)将数据集中的数据列「月份」拖入到 A2 单元格中,将数据集中的数据列「应付金额」拖入到 B2 单元格中,并在「单元格元素>数据设置」中对单元格数据进行「汇总>求和」,如下图所示:
3)在 C2 单元格写入公式 B2 - B2[A2:1],计算 B2 单元格扩展出来的数据,每一行与第一行的差值,如下图所示:
公式说明:公式解释详情参见:层次坐标
公式 | 说明 |
---|---|
B2 | 本期应付金额 |
B2[A2:1] | 01月份的应付金额,即返回 A2 列的第一个数值对应的 B2 单元格数值 |
B2 - B2[A2:1] | 本期应付金额-01月份的应付金额 |
4)在 D2 单元格写入公式B2 / SUM(B2[!0]),计算 B2 单元格扩展出来的数据,每一行在总值中的占比,如下图所示:
公式说明:
公式 | 说明 |
---|---|
B2 | 本期应付金额 |
B2[!0] | 返回 B2 扩展出来的所有值,即3949.70,2293.65,2310.21,2116.69,1346.74,4780.93 详情参见:层次坐标常用公式 |
SUM(B2[!0]) | 对返回的所有 B2 值求和,也就是所有月份应付金额总计 |
B2 / SUM(B2[!0]) | 计算每月应付金额占总计额比重 |
5)在 E2 单元格写入公式IF(&A2 > 1, B2 / B2[A2:-1], 0),计算 B2 单元格扩展出来的数据,每一行与上一行的比率,如下图所示:
公式说明:
公式 | 说明 |
---|---|
&A2 | 获取单元格 A2 扩展后每个值对应的位置 |
B2 / B2[A2:-1] | B2[A2:-1]:返回上一个月的应付金额 B2 / B2[A2:-1]:本月应付金额/上月应付金额 |
IF(&A2 > 1, B2 / B2[A2:-1], 0) | 如果不是序号为1 ,即第一个单元格,则用,如果是第一个单元格,则输出 0 |
2.4 效果查看
2.4.1 PC 端
详情参见本文 2.1 节。
2.4.2 移动端
App 与 HTML5 端效果相同,如下图所示:
3. 示例二
3.1 预期效果
效果如下图所示:
字段名 | 公式 |
---|---|
逐层累计 | 按照年份分组,计算每一年月份应付金额的累加 分组报表中,每一组数据逐行累计。 |
跨层累计 | 计算所有年月应付金额累加 分组报表中,所有数据逐行累计,跨组时接着上一组累计结果继续累计。 |
条件汇总 | 对符合条件的数据进行汇总 |
3.2 数据准备
新建数据集 ds1,数据库查询对话框中写入 SQL 查询语句:
SELECT STRFTIME('%Y',订购日期) AS 年份,STRFTIME('%m',订购日期) AS 月份,应付金额
FROM 订单
WHERE STRFTIME('%Y',订购日期) IN ('2010','2011')
3.3 报表设计
按照表格中的说明设计报表。
单元格 | 操作 |
---|---|
A1~E1 | 单元格依次写入字段标题名:年份,月份,应付金额,逐层累计,跨层累计。选中 A1~E1 单元格,设置标题预定义样式为Head类型 |
A2 | 数据集中的数据列「年份」拖入到单元格中 |
B2 | 数据集中的数据列「月份」拖入到单元格中 |
C2 | 数据集中的数据列「应付金额」拖入到单元格中,并在单元格元素>数据设置中对单元格数据进行汇总>求和 |
D2 | 写入公式C2 + D2[B2:-1],C2 单元格扩展出来的数据按年份逐行累计 |
E2 | 写入公式IF(&B2 > 1, C2 + E2[B2:-1], C2 + E2[A2:-1,B2:!-1]),C2 单元格扩展出来的数据逐行累计,跨年份时接着上一年份的累计结果继续累计,其中B2:!-1表示是找该组B2列的倒数第1行,如果是B2:!-2就是倒数第2行 |
A3~C3 | 合并 A3~C3 单元格,写入字段标题名:应付金额大于2500的月份个数。设置左父格为 A2,标题预定义样式为Head类型 |
D3~E3 | 合并 D3~E3 单元格,写入公式COUNT(C2[!0]{A2=$A2 && C2>2500}),统计应付金额大于2500的月份个数 |
公式说明:
1)逐层累计:C2 + D2[B2:-1]
公式 | 说明 |
---|---|
D2[B2:-1] | 每次返回当年逐层累计列的上一个数值 比如:2010年1月 返回0;2010年2月返回 1月份对应的 D2 的值 2837.94 |
C2 + D2[B2:-1] | 当前年月的应付金额+上一个逐层累计列单元格数值 |
2)跨层累计:IF(&B2 > 1, C2 + E2[B2:-1], C2 + E2[A2:-1,B2:!-1])
公式 | 说明 |
---|---|
&B2 | 获取单元格 B2 扩展后每个值对应的位置 注:B2 的位置根据左父格年份从头累计 例如:2011年01月份 返回的为 1 ;2010 年01月份 返回的也为 1 详情参见:层次坐标常用公式 |
E2[B2:-1] | 每次返回当年逐层累计列的上一个数值 比如:2010年1月 返回0;2010 年 2 月返回 1月份对应的 E2 的值 2837.94 详情参见:层次坐标 |
E2[A2:-1,B2:!-1] | 对每年的01月份数据,都返回上一年的最后一个月份的跨层累计数据 例如:2011年01月的跨层累计返回 2010年06月的跨层累计数据 即 15631.50 |
IF(&B2 > 1, C2 + E2[B2:-1], C2 + E2[A2:-1,B2:!-1]) | 如果不是每年的第一个月,则返回当年逐层累计列的上一个数值+当月应付金额,如果是每年的第一个月,返回上一年的最后一个月份的跨层累计数据+当月应付金额 |
3)条件汇总:COUNT(C2[!0]{A2=$A2 && C2>2500})
公式解释详情参见:层次坐标常用公式
公式 | 说明 |
---|---|
A2=$A2 | $A2 获取单元格 A2 扩展后对应位置上的值 然后判断 A2 是否和 A2 扩展出去的值相等 即判断是否在同一年,由于需求为分年统计 |
A2=$A2 && C2>2500 | 同时满足在同一年内且每月应付金额大于2500 |
C2[!0]{A2=$A2 && C2>2500} | 取同时满足在同一年内,且每月应付金额大于2500的金额 比如:2010 年返回的数值为 2837.94、3596.13、2822.19、2580.17 |
COUNT(C2[!0]{A2=$A2 && C2>2500}) | 对返回的应付金额计数 |
3.4 效果查看
3.4.1 PC 端
详情参见本文 3.1 节。
3.4.2 移动端
App 与 HTML5 端效果相同,如下图所示:
4. 模板下载
已完成模板可参见:%FR_HOME%\webroot\WEB-INF\reportlets\demo\NewbieGuide\层次坐标示例1.cpt
已完成模板可参见:%FR_HOME%\webroot\WEB-INF\reportlets\demo\NewbieGuide\层次坐标示例2.cpt
点击下载模板:层次坐标示例1.cpt
点击下载模板:层次坐标示例2.cpt