最新历史版本 :扩展后多列按先后排序 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 问题描述

数据集中我们可以用 SQL 语句中 order by A,B 语句,将结果先按照 A 排序,再按照 B 来排序。那么设计器中如何使用「扩展后排序」实现多列排序呢?

例如:扩展后结果先按照「销售员」排序,相同的销售员再按照「销量」排序,如下图所示:

Snag_13c29e68.png

1.2 解决思路

1)字符类型的数据可以通过INARRAY(字符, SORTARRAY(UNIQUEARRAY(扩展的所有字符)))获得排序位置。

2)数值类型的数据直接通过本身的大小排序。

将 1)和 2)的结果经过运算处理得出一个新的数值,最后按照新数进行排序。

2. 示例编辑

2.1 准备数据

新建普通报表,新建数据库查询 ds1,输入 SQL 语句:SELECT * FROM 销量 where 地区='华北'

2.2 设计表格

1)将数据集中的字段依次拖入 A2~E2 单元格,表格如下图所示:

Snag_13d67ce5.png

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 端均支持,效果如下图所示:

222

3. 模板下载编辑

已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\扩展后多列排序.cpt

点击下载模板:扩展后多列排序.cpt