本部分介绍了报表中常用数据集函数的函数说明、语法、参数说明、返回值、选项以及示例。
说明:函数参数中,{}代表该参数为可选参数,并非必须参数
函数说明:
从数据集当前记录行集中检索出符合条件的记录集合,算出给定字段或表达式的平均值
语法:
datasetName.avg(selectExp{,filterExp})
参数说明:
selectExp |
需要计算平均值的字段或表达式,数值类型 |
filterExp |
过滤条件表达式 |
返回值:
实数
选项:
@r |
是否为根数据集表达式,根数据集即表示最外层数据 |
@a |
对数据集计数,包含null值 |
@b |
二分法查找,提高运算速度,要求按filterExp中用到的字段有序,并且filterExp必须使用==,可以是一个或者多个,多个时用&&,==左边是关于ds的表达式,右边是值。 |
示例:
例1:ds1.avg(score,gender=="F")
从数据集ds1当前行集中过滤出gender为"F"的记录集合,求得其score字段的平均值。
例2:ds1.avg(quantity*price)
从数据集ds1当前行集中求得表达式quantity*price的平均值
例3:ds1.avg@a(score)
从数据集ds1当前行集中求得score字段的平均值,字段值为空的记录同样记入记录数。
例4:ds1.avg@r(score)
从根数据集的记录行集中求得score字段的平均值。
例5:ds1.avg@b(score,gender=="F")
同例1,用@b选项,二分法查找,提高运算速度。
函数说明:
从数据集中按顺序检索,采用二分法查找符合过滤条件的记录,返回其selectExp值。
此函数功能等同select(),但是算法不同,采用二分法,适用于数据集记录。
已经按照参考字段排好序的情况,运算速度比select()快。
语法:
datasetName.bfind(selectExp,referExp1:referValueExp1:referOrderExp1{,referExp2:referValueExp2:referOrderExp2{....}})
参数说明:
selectExp |
选出字段或表达式 |
referExp1 |
参考字段表达式 |
referOrderExp1 |
参考字段表达式的数据顺序,>0升序,<0降序 |
referValueExp1 |
参考字段的值表达式,一旦找到参考字段和该值相同的记录,即返回selectExp的值 |
...... |
参考字段及其值可以多个,如果是多个,则找到多个参考字段都和值匹配的记录才返回 |
返回值:
数据类型不定,由selectExp的运算结果决定
选项:
@r |
是否为根数据集表达式,根数据集即表示最外层数据集 |
示例:
例1:ds1.bfind(name,id:value():1)
采用二分法,找到数据集ds1中id和当前格的值相等的记录,返回其name字段值
例2:ds1.bfind(name,id:value():1;class:A1:1; gender:B1:-1)
采用二分法,找到数据集ds1中id和当前格的值相等、class和A1相等,且gender和B1相等的记录,返回其name字段值。注意这三个条件在表达式中的顺序必需和它们在数据集中的排序先后相同,也就是说,在数据集中是先对id升序排序,再对class升序排序,最后对gender进行降序排序的。
例3:ds1.bfind@r(NAME,EID:2:1)
采用二分法,找到根数据集ds1中EID等于2的记录,返回其NAME字段值
函数说明:
计算数据集当前记录行集中,满足条件的记录数
语法:
datasetName.count({filterExp})
参数说明:
filterExp |
条件表达式,如果全部选出,则不要此参数 |
返回值:
整数
选项:
@r |
是否为根数据集表达式,根数据集即表示最外层数据集 |
@b |
二分法查找,提高运算速度,要求按filterExp中用到的字段有序,并且filterExp必须使用==,可以是一个或者多个,多个时用&&,==左边是关于ds的表达式,右边是值。 |
示例:
例1:ds1.count()
表示对数据集ds1中当前记录行集中所有记录进行计数,返回记录数。
例2:ds1.count(true)
含义同上,但是运算速度比ds1.count()慢,因此当记录全部选出时,建议不要true
例3:ds1.count(quantity>500)
表示从数据集ds1当前记录行集中选出quantity>500的记录进行计数,返回记录数。
例4:ds1.count@r(quantity>500)
表示从根记录行集中求得quantity>500的纪录数
例5:ds1.count@b(quantity==500)
表示从当前记录行集中求得quantity等于500的纪录数
用@b选项,二分法查找,提高运算速度。
函数说明:
计算数据集当前记录行集中,满足条件的记录数,选出的字段值相同的记录将被视为同一个记录
语法:
datasetName.dcount(<select_exp>{,filterExp})
参数说明:
select_exp |
要选择的字段列名/列号,也可以是表达式。 列号用#n表示,例如#0代表第0列,#1代表第1列,依此类推 |
filterExp |
条件表达式,如果全部选出,则不要此参数 |
返回值:
整数
选项:
@r |
是否为根数据集表达式,根数据集即表示最外层数据集 |
@b |
二分法查找,提高运算速度,要求按filterExp中用到的字段有序,并且filterExp必须使用==,可以是一个或者多个,多个时用&&,==左边是关于ds的表达式,右边是值。 |
示例:
例1:ds1.dcount(name)
从数据源ds1的当前记录行集中选取name字段列的所有值,name相同的纪录被视为同一纪录
例2:ds1.dcount(#5)
从数据源ds1的当前记录行集中选取第5列的所有值,第5列中值相同的纪录被视为同一纪录
例3:ds1.dcount( name,name!=”Ryan”)
从数据源ds1的当前记录行集中选取name不为Ryan的字段列的所有值,name相同的纪录被视为同一纪录
例4:ds1.dcount@r( name )
从根数据源ds1中选取name字段列的所有值,name相同的纪录被视为同一纪录
例5:ds1.dcount@b( name,name==”Ryan”)
从数据源ds1的当前记录行集中选取name为Ryan的字段列的所有值,name相同的纪录被视为同一纪录。二分法查找,提高运算速度。
函数说明:
获得数据集的列数
语法:
datasetName.fcount()
返回值:
整数
示例:
例1:ds1.fcount() 获得ds1数据集的列数,整数类型
函数说明:
获得数据集当前行或者当前组中第一行中,指定列的数据。
语法:
datasetName.field(fieldNameExp)
datasetName.field( filedNoExp)
参数说明:
fieldNameExp |
字符串,字符串内容为数据集列名的表达式,列名包含特殊字符建议使用 |
filedNoExp |
整数,数据集列号的表式方式,如第二列用2,行号列用0 |
返回值:
数据集的列对象,只能作为表达式的元素使用,不能作为最终单元格的值
说明:
此函数性能比较低,请慎用
示例:
例1:在报表中写入如下表达式
|
A |
B |
1 |
|
= to(1,ds2.fcount()) |
2 |
|
= ds2.fname(B1) |
3 |
= ds2.select(#0) |
= ds2.field(B2) |
设置B1单元格的扩展方式为横向扩展,A3单元格的扩展方式为纵向扩展。该报表相当于在B1中根据数据集ds2的列数进行横向扩展,在A3中根据数据集的行数进行纵向扩展,然后在B2和B3中动态获取列名和列对象,算出列值,这种用法可以实现动态列报表。
该报表的预览结果如下:
例2:ds1.field(“DEPT”) 返回数据集ds1中当前行的DEPT字段对应的数据。
例3:ds1.field(3) 返回数据集ds1中当前行的第3列对应的数据。
函数说明:
根据列号取数据集的列名
语法:
datasetName.fname(fieldNoExp)
参数说明:
fieldNoExp |
数据集列号的表达式 |
返回值:
字符型
示例:
例1:ds1.fname(3) 返回"score"
表示数据集ds1中第三列的列名为"score"
例2:运用举例,在报表中写入如下表达式
|
A |
B |
1 |
|
= to(1,ds2.fcount()) |
2 |
|
= ds2.fname(B1) |
3 |
= ds2.select(#0) |
= ds2.field(B2) |
设置B1单元格的扩展方式为横向扩展,A3单元格的扩展方式为纵向扩展。该报表相当于在B1中根据数据集ds2的列数进行横向扩展,在A3中根据数据集的行数进行纵向扩展,然后在B2和B3中动态获取列名和列对象,算出列值,这种用法可以实现动态列报表
该报表的预览结果如下:
函数说明:
根据分组表达式,从数据集中选出一组组集。
语法:
datasetName.group(<selectExp:order1>{,filterExp};;{ groupSortExp }:{ groupOrderExp })
//适用于不需要排序或数据集中已排好序。此函数是下面的优化写法,分组字段和排序字段通常是同一个。
datasetName.group(<selectExp>{,filter_exp};{sort1}{:order1},…;{ groupSortExp }:{ groupOrderExp })
参数说明:
selectExp |
选出的分组表达式,可以是字段列名/列号,也可以是表达式。列号用#n表示,例如#0代表第0列,#1代表第1列,依此类推 |
filterExp |
过滤表达式 |
sort1 |
分组前记录的排序依据表达式 |
order1 |
分组前记录的排序顺序,省略为不排序,>0升序,<0降序;order1,..,ordern省略时升序 |
groupSortExp |
分组后对组的排序表达式,一般是汇总运算的表达式,如组合计等 |
groupOrderExp |
组排序顺序,>0升序,<0降序 |
返回值:
一组数据的集合,数据类型由selectExp的运算结果来决定
选项:
@r |
是否为根数据集表达式,根数据集即表示最外层数据集 |
@b |
二分法查找,提高运算速度,要求按filterExp中用到的字段有序,并且filterExp必须使用==,可以是一个或者多个,多个时用&&,==左边是关于ds的表达式,右边是值。 |
示例:
例1:ds1.group(class)
把数据集ds1中所有记录按照class字段不排序只进行分组,相邻相同的值分到一组,并返回每组的class值组成的集合
例2:ds1.group(class:-1)
把数据集ds1中所有记录按照class字段降序排列,然后根据class进行分组,并返回每组的class值组成的集合
例3:ds1.group(class, gender =='F'; class)
从数据源ds1中选取性别为"F"的记录,按照class字段升序排列,然后根据class进行分组,并返回每组的class值组成的集合,order1缺省为升序
例4:ds1.group(class, gender =='F'; id:-1)
从数据源ds1中选取性别为"F"的记录,按照id字段降序排列,然后根据class进行分组,并返回每组的class值组成的集合
例5:ds1.group(省份;省份:1; ds1.sum(工业产值):-1)
对数据集ds1按照省份进行分组,分组后求出每组的sum(工业产值),然后按照这个汇总值对组进行逆序排列
例6:ds1.group@r(GENDER;GENDER;ds1.sum(SALARY))
对根数据集ds1按照GENDER进行分组,分组后求出每组的sum(SALARY),然后按照这个汇总值对组进行升序排列
例7:ds1.group@b(class, gender =='F'; class)
同例3,用@b选项,二分法查找,提高运算速度。
函数说明:
判断数据集中是否有该列名。
语法:
datasetName.isfield( stringExp )
参数说明:
stringExp |
待判断的列名表达式 |
返回值:
布尔型
示例:
例1:ds1.isfield("score") 返回true,表示ds1中含有score这个列名
函数说明:
从数据集当前记录行集中检索出符合条件的记录集合,选出给定字段或表达式的最大值。
语法:
datasetName.max(selectExp{,filterExp})
参数说明:
selectExp |
需要获得最大值的字段或表达式如果用列号,列号用#n表示,例如#0代表第0列,#1代表第1列,依此类推 |
filterExp |
过滤表达式 |
返回值:
集合中的最大值,数据类型不定,由selectExp的运算结果决定
选项:
@r |
是否为根数据集表达式,根数据集即表示最外层数据集 |
@b |
二分法查找,提高运算速度,要求按filterExp中用到的字段有序,并且filterExp必须使用==,可以是一个或者多个,多个时用&&,==左边是关于ds的表达式,右边是值。 |
示例:
例1:ds1.max(score)
从数据集ds1当前行集中求得score最大值
例2:ds1.max(score, gender =="F")
从数据集ds1当前行集中检索出gender =="F"的记录中score最大值
例3:ds1.max(#3)
从数据集ds1当前行集中求得第3列的最大值
例4:ds1.max@r(#3)
从根数据集ds1当前行集中求得第3列的最大值
例5:ds1.max@b(score, gender =="F")
同例2,用@b选项,二分法查找,提高运算速度。
函数说明:
从数据集当前记录行集中检索出符合条件的记录集合,选出给定字段或表达式的最小值
语法:
datasetName.min(selectExp{,filterExp})
参数说明:
selectExp |
需要获得最小值的字段或表达式如果用列号,列号用#n表示,例如#0代表第0列,#1代表第1列,依此类推 |
filterExp |
过滤表达式 |
返回值:
集合中的最大值,数据类型不定,由selectExp的运算结果决定
选项:
@r |
是否为根数据集表达式,根数据集即表示最外层数据集 |
@b |
二分法查找,提高运算速度,要求按filterExp中用到的字段有序,并且filterExp必须使用==,可以是一个或者多个,多个时用&&,==左边是关于ds的表达式,右边是值。 |
示例:
例1:ds1.min(score) 从数据集ds1当前行集中求得score最小值
例2:ds1.min(score, gender =="F") 从数据集ds1当前行集中检索出gender =="F"的记录中score最小值
例3:ds1.min(#3) 从数据集ds1当前行集中求得第3列的最小值
例4:ds1.min@r(#3) 从根数据集ds1当前行集中求得第3列的最小值
例5:ds1.min@b(score, gender =="F") 同例2,用@b选项,二分法查找,提高运算速度。
函数说明:
根据数据值段进行分组,俗称“按段分组”
语法:
datasetName.plot(valueExp,listExp{,filterExp})
参数:
valueExp |
用于分组的值表达式 |
listExp |
数据值段列表,同valueExp数据类型相同的数组,要求其中元素从小到大排列 |
filterExp |
过滤表达式 |
返回值:
整数组,代表记录按值段分组后组的顺序,如list(0,1,2,3)代表第一组,第二组,第三组,第四组。因此,定义完单元格数据值表达式后还需要定义显示值表达式,比如第一组代表不及格,第二组代表及格等等
选项:
@r |
是否为根数据集表达式,根数据集即表示最外层数据集 |
@c |
表示与元素比较时数据值段临界值只包含在第1个碰到的区间,相同的临界值不包含在第2个碰到的区间。缺省数据值段临界值只包含在第2个碰到的区间 |
@z |
表示listExp返回的数组按从大到小排列;缺省为从小到大排列 |
@b |
二分法查找,提高运算速度,要求按filterExp中用到的字段有序,并且filterExp必须使用==,可以是一个或者多个,多个时用&&,==左边是关于ds的表达式,右边是值。 |
示例:
例1:ds1.plot(成绩,list(60,80,90) ,科目=="数学") 返回值为list(0,1,2,3) 对数据集ds1过滤出科目等于数学的记录按成绩段进行分组,60分以下不包含60分、60-79,80-89,90分及90分以上等四组。同时定义显示值表达式为:map(list(0,1,2,3),list("不及格","及格","良好","优秀"))
例2:ds1.plot@c(成绩,arg1) 其中arg1为参数,其数据类型是整数组,其值为"60,70,80,90" 。显示值表达式为:map(to(0,count(arg1)),arg2),其中arg2为字符串组,其值为{"不及格","及格","中","良好","优秀"}
本例通过参数动态控制分组值段以及结果组的显示值
例3:ds1.plot@b(成绩,list(60,80,90) ,科目=="数学") 同例1,用@b选项,二分法查找,提高运算速度。
函数说明:
从数据集的当前行集中选取符合条件的记录,当列名与参数名、单元格名产生冲突时用数据集名称限定。
语法:
datasetName.select(<select_exp>{: order_exp},{ filter_exp },{num_exp},{distinct_exp})
datasetName.select(<select_exp>{, filter_exp },{ num_exp },{distinct_exp}; {sort1_exp}:{order1_exp},….) //适用于不需排序或数据集中已排好序
参数说明:
select_exp |
选择的字段列名/列号,也可以是表达式。列号用#n表示,例如#0代表第0列,#1代表第1列,依此类推 |
order _exp |
指定数据排序的顺序,<0表示降序排列,>0表示升序排列 |
filter_exp |
数据过滤表达式,如果全部选出,则此参数省略,仅用“,”占位 |
num_exp |
获取查询结果的前n条记录 |
distinct_exp |
筛选某字段,返回唯一不同的值 |
sort1_exp |
数据排序表达式。当此项为空时先检查order_exp是否为空,如果为空,则不排序,否则使用select_exp排序 |
返回值:
一组数据的集合,数据类型由select_exp的运算结果决定
选项:
@r |
是否为根数据集表达式,根数据集即表示最外层数据集 |
@z |
从后往前取数,num_exp省略时返回全部 |
@b |
二分法查找,提高运算速度,要求按filterExp中用到的字段有序,并且filterExp必须使用==,可以是一个或者多个,多个时用&&,==左边是关于ds的表达式,右边是值。 |
示例:
例1:ds1.select( name )
从数据集ds1中选取name字段列的所有值, 不排序
例2:ds1.select(ds1.F1)
从数据集ds1中选取F1字段列的所有值,F1为字段名。由于字段名与列名同名产生冲突因此用数据集名称限定
例3:ds1.select( #2:-1)
从数据集ds1中选取第二个字段列的所有值并降序排列
例4:ds1.select( name:1, gender =='M')
从数据集ds1中选取性别为男性的name字段列的值并升序排列
例5:ds1.select( name:-1, gender =='M',50, id )
从数据集ds1中筛选掉id字段重复值,选取50条性别为男性的name字段列的值并按name字段降序排列
例6:ds1.select(int(EMPID), gender =='M',50,id;BONUS:1)
从数据集ds1中筛选掉id字段重复值,将数据集按BONUS升序排列,选取50条性别为男性的EMPID字段列的值
例7:ds1.select@r(#9:-1,SALARY>=10000)
从根数据集ds1中筛选SALARY大于10000的第9列的值并降序排列
例8:ds1.select@z(#9:1,SALARY>=10000,3)
从数据集ds1中筛选SALARY大于10000的第9列的最后3个值并升序排列
例9:ds2.select@b(amout,c_code==A3)
使用二分法从数据集ds2中选取c_code为A3的amout字段列的值,code字段有序。
函数说明:
从数据集当前记录行集中检索出符合条件的记录集合,算出给定字段或表达式的汇总值
语法:
datasetName.sum(selectExp{,filterExp})
参数说明:
selectExp |
需要求和的字段或表达式,数值类型 |
filterExp |
条件表达式 |
返回值:
实数
选项:
@r |
是否为根数据集表达式,根数据集即表示最外层数据集 |
@b |
二分法查找,提高运算速度,要求按filterExp中用到的字段有序,并且filterExp必须使用==,可以是一个或者多个,多个时用&&,==左边是关于ds的表达式,右边是值。 |
示例:
例1:ds1.sum(quantity)
从数据集ds1当前行集中求得quantity字段的汇总值
例2:ds1.sum(quantity,productid==1)
从数据集ds1当前行集中检索出productid==1的记录集,求得其quantity字段的汇总值
例3:ds1.sum@r(score)
从求得根数据集的记录行集中score字段的汇总值。
例4:ds1.sum@b(quantity,productid==1)
同例2,用@b选项,二分法查找,提高运算速度。