1. 概述
1.1 问题描述
数据集中我们可以用 SQL 语句中 order by A,B 语句,将结果先按照 A 排序,再按照 B 来排序。那么设计器中如何使用「扩展后排序」实现多列排序呢?
例如:扩展后结果先按照「销售员」排序,相同的销售员再按照「销量」排序,如下图所示:
1.2 解决思路
1)字符类型的数据可以通过INARRAY(字符, SORTARRAY(UNIQUEARRAY(扩展的所有字符)))获得排序位置。
2)数值类型的数据直接通过本身的大小排序。
将 1)和 2)的结果经过运算处理得出一个新的数值,最后按照新数进行排序。
2. 示例
2.1 准备数据
新建普通报表,新建数据库查询 ds1,输入 SQL 语句:SELECT * FROM 销量 where 地区='华北'
2.2 设计表格
1)将数据集中的字段依次拖入 A2~E2 单元格,表格如下图所示:
2)将 A2 单元格数据设置为「列表」,如下图所示:
2.3 设置扩展后排序
选中 A2 单元格,设置「扩展后排序」为「升序」,输入公式:INARRAY(B2,SORTARRAY(UNIQUEARRAY(B2[!0])))*POWER(10, LEN(MAX(E2[!0])))+E2
这个公式涉及到 B2 和 E2 单元格的组合计算,正是这种组合计算实现了先 B2 排序,再 E2 排序的效果。公式拆解说明如下:
部分 | 说明 |
---|---|
SORTARRAY(UNIQUEARRAY(B2[!0])) | B2 单元格是文本数据,所以要使用 SORTARRAY 函数对其进行排序 |
INARRAY(B2,SORTARRAY(UNIQUEARRAY(B2[!0]))) | SORTARRAY 函数已经将 B2 排好序了,且数据保存为数组 再使用 INARRAY 函数输出数组里面每个文本数据的位置 就是将排好序的文本转化为数字,方便后面跟 E2 组合计算,再对 E2 排序 |
*POWER(10, LEN(MAX(E2[!0]))) | 这是个固定的乘幂,前面公式乘这个数,就是为了将代表文本位置的数字增大 为什么要增大这个数呢?这是因为后面还要加上 E2,如果只是用1、2、3这样比较小的数,加上 E2 后会影响到 B2 排序 |
+E2 | B2 单元格相同时,组内根据加上的 E2 单元格数值,得到的和再进行组内排序 也就是在 B2 排好序的基础上,再对 E2 排序 |
步骤如下图所示:
2.4 效果预览
1)PC 端
保存报表,点击分页预览,效果如 1.1问题描述 中所示。
2)移动端
App 和 HTML5 端均支持,效果如下图所示:
3. 模板下载
已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\扩展后多列排序.cpt
点击下载模板:扩展后多列排序.cpt