海关进出口同比增长率
测试数据为上海海关的进出口数据,结构如下:
字段名 | 说明 |
---|---|
TRADE_YEAR | 统计年 |
TRADE_MONTH | 统计月 |
IMPORTS | 进口数据 |
EXPORTS | 出口数据 |
希望实现的报表效果是将20年的数据与19年的数据做同期对比,将21年的数据和20年的数据做同期对比,显示增长率:
一个简单的交叉表设计
首先完成一个简单的交叉表的设计:
字段绑定设置
其中:
- A2, A6都是绑定TRADE_YEAR字段
- B3绑定IMPORTS字段
- B4绑定EXPORTS字段
- B1绑定TRADE_MONTH字段
注意设置B1的展开方向为横向展开
父子格设定
- 设定B3的左父格为A2,上父格为B1
- 设定B4的左父格为A2,上父格为B1
预览界面
现在预览界面我们就看到一个简单的交叉表的效果
行号判断
所谓同比,是要拿当前和往期比的。所在该示例中,因为没有对应的2018年的数据,所以2019年的数据应该都为空,从2020年开始所有数据都需要计算同比。 所以我们可以在B7和B8里输入表达式:
=(&A6>1)?"需要计算":""
这个表达式表示获取当前单元格相对的A6单元格展开后的序号,序号从1开始,就表示第一年不进行同比计算
预览效果:
调整表达式
为了后边的表达式编写,我们将表达式的格式调整为:
if (&A6>1) {
return "需要计算"
}
父子格设定
- 设定B7的左父格为A6,上父格为B1
- 设定B8的左父格为A6,上父格为B1
添加辅组列
由于B7和B3没有直接的父子关系,所以直接获取B3的相关值会比较困难,同理B8和B4也一样,为了解决这个问题,我们可以在C列上设定C7和C8,并分别绑定IMPORTS以及EXPORTS字段。 同样C7和C8字段要设定相同的父格
- 设定C7的左父格为A6,上父格为B1
- 设定C8的左父格为A6,上父格为B1
设计效果如下:
预览效果如下:
现在我们就可以在B7里取出C7的值了。
获取当前值
将表达式调整为:
if (&A6>1) {
var currentValue = C7
return currentValue
}
预览
获取去年同月份的值
将表达式调整为:
if (&A6>1) {
var currentValue = C7
var oldValue = C7[A6:-1]{$B1==B1}
return currentValue + ":" + oldValue
}
其中C7[A6:-1]表示获取上一年度C7的值。 {$B1==B1}是过滤条件,表示C7单元格对应数据的B1单元格的值要和当前表达式对应的B1单元格的值一致,就是月份相同的意思
预览
计算同比增长率
现在就可以基于currentValue和oldValue计算同比增长率了,将表达式调整为:
if (&A6>1) {
var currentValue = C7
var oldValue = C7[A6:-1]{$B1==B1}
if (currentValue) {
return (currentValue-oldValue)/oldValue
}
}
考虑到2021年部分数据缺失,所以是没有currentValue的,所以表达式中添加了currentValue的if判断。
数据可视化显示
利用格式化功能格式化B7的数据:
预览
处理B8字段
用相同的方法处理B8字段,其表达式改为:
if (&A6>1) {
var currentValue = C8
var oldValue = C8[A6:-1]{$B1==B1}
if (currentValue) {
return (currentValue-oldValue)/oldValue
}
}
预览
隐藏数据辅助列C
最后我们隐藏C1列:
再次预览,就得到我们需要的最终报表了。