层次坐标
复杂报表层次坐标:当前行、上一行、去年同月、条件筛选、累计和排名。
纵向或横向扩展之后,设计器里的一个格子会变成许多行(或许多列)。层次坐标用来在这些扩展结果里定位:当前行、上一行、去年同一月,或「同一年内到本月为止的全部金额」。完整做表步骤见 同比环比等财务统计表。
1. 先分清三种格子
| 角色 | 扩展方向 | 左主格 | 例子 |
|---|---|---|---|
| 分组主格 | 纵向扩展 | 无,或指向更左边的主格 | A3 年份,B3 月份且左主格为 A3 |
| 跟随格 | 不扩展 | 自定义,填它要跟着的主格 | 销售额 D3 左主格 B3。公式格同样指向 B3 |
| 公式格 | 不扩展 | 与它要「按行对齐」的那个主格相同 | 环比 E3 左主格 B3 |
数据集查询请按主格顺序排好,例如 ORDER BY 年份, 月份。否则「上一个月」会指到错误的行。
2. 条件里的左右两边
写成 D3[]{A3==A3 && B3<=B3} 时:
- 花括号里左边的单元格,是正在被筛选的那一行。
- 右边的单元格,是公式自己所在的这一行。
所以 A3==A3 是「候选行的年份等于当前行的年份」,B3<=B3 是「候选行的月份小于等于当前行的月份」。多个条件用 && 连接。
3. 常用写法
| 写法 | 含义 | 示例 |
|---|---|---|
单元格[] | 该格扩展后的全部值 | SUM(D3[]) 全部销售额 |
单元格[]{条件} | 全部值里,满足条件的那些 | SUM(D3[]{A3==A3}) 当年合计 |
单元格[主格:-0] | 当前这个主格对应的值。金额列设了千分位时,除法用这个写法取原始数字 | D3[B3:-0] 本月销售额 |
单元格[主格:-1] | 同一主格序列里的上一个。月份连续、且按月排序时,就是上一个月 | D3[B3:-1] 上月销售额 |
单元格[主格:-1]{条件} | 先按主格位移,再用条件收成一行 | D3[A3:-1]{B3==B3} 去年同一月份 |
单元格[主格:1] | 绝对位置,从 1 开始,1 是第一个 | D3[B3:1] 该序列第一个月 |
单元格[主格:!-1] | 从后往前数,!-1 是最后一个 | D3[B3:!-1] |
:-1 会跨过年份,只要月份主格在数据里是连续排下来的。每年 1 月若不能用上一年的 12 月,必须先判断月份,再取上一格:
if (B3 == 1) { null } else { D3[B3:-0] / D3[B3:-1] }
第一年没有「上一年」。先判断年份,再写 [A3:-1]。不要在条件不成立时仍去取不存在的坐标,否则这一格算不出来,整次预览会失败。
4. 四个常用口径
下面都假设 A3 是年份,B3 是月份,D3 是销售额,且公式格的左主格是 B3。
| 口径 | 公式 | 说明 |
|---|---|---|
| 月份环比 | if (B3 == 1) { null } else { D3[B3:-0] / D3[B3:-1] } | 本月 ÷ 上月。1 月为空,不跨年。格式用百分比。 |
| 年份同比 | if (A3 == 2010) { null } else { D3[B3:-0] / D3[A3:-1]{B3==B3} } | 本月 ÷ 去年同月。{B3==B3} 把上一年的 12 个月收成与当前月份相同的那一个。第一年为空。 |
| 占当年比重 | D3[B3:-0] / SUM(D3[]{A3==A3}) | 本月 ÷ 当年合计。格式用百分比 0%。 |
| 年内累计 | SUM(D3[]{A3==A3 && B3<=B3}) | 同一年里,月份小于等于本月的金额之和。 |
| 年内排名 | COUNT(D3[]{A3==A3 && D3>D3[B3:-0]}) + 1 | 同年里比本月更大的个数,再加 1。最大为 1。 |
| 全部排名 | COUNT(D3[]{D3>D3[B3:-0]}) + 1 | 所有月份里比本月更大的个数,再加 1。 |
5. 设计时注意
- 公式格不要再设成纵向扩展,否则每个公式会自己再展开一套,行对不齐。
- 隐藏列(例如只给公式用的月份数字)仍占设计上的一列。标题合并时按全部列合并即可,预览会按可见列对齐。
- 分组排名不要给
SORT再加第四个参数。用上面的COUNT。
