在练习6.2-2里我们完成了一张学生3科成绩的交叉报表。现在我们对各科成绩进行排名。
步骤1: 先复习一下10.1节学到的内容。

我们前面已经讲过有多个过滤条件时的表达式用法了,这里也是这样。统计成绩在80—90之间时,不仅B3〉=80还要B3<90
通常我们不仅是要做这样的统计,而且要列出每个人成绩的排名。
在传统的报表工具中,这是一项很困难的事情,需要预先编程序进行计算,而润乾报表引进了层次座标的概念,可以很好地处理许多非常复杂的跨行、组的计算。
层次座标的概念是比较复杂的,我们还是通过实例,一点一点地理解。
仍然看这个排名的问题,很显然,显示每个人的排名,就是数一下所有的成绩中,比自己高的成绩有多少(然后还要+1),如排名2的话,比他成绩高的有1个,1+1=2。也就是说,排名表达式应该是:
=count(…)+1 这种样子。

当然,主要问题是count函数()里面应该怎么写,我们有几个问题:
问题1: 成绩都是在b3这个格里,而c3是与b3一样,都是从a3主格扩展出来的,这就与在下面的格子如b5、b6里面写表达式不一样了,为什么呢?我们先做下面的尝试:
在c3里输入与b5同样的表达式,对成绩〉=90的人数统计:

预览:

可以发现只对每个人的成绩作了〉=90的计数,而不是所有的人。
同理,再在c3里输入与b6同样的表达式,对成绩<90且〉=80的人数统计,预览如下:

只对每个人的成绩作了<90且〉=80的计数,而不是所有的人。
就是成绩都是在b3这个格里,而c3是与b3一样,都是由a3主格扩展出来的,即a3扩展出一个b3时,同时也扩展出一个c3,c3单元格里表达式中的b3就受到了限制,c3只对与其同行的一个b3单元格作统计,而不是所有的b3。
问题2: 如何在这里表示“所有的b3”呢?
写法是:b3[`0],它可以表示所有的b3格。
这里的规则是:Cell[Lk],表示由Lk扩展出来的所有的Cell这个格子。
是不是很难理解,没关系,看一个例子就明白了:
C3[B3],假如B3是一个主格,这个公式就表示由B3扩展出来的所有C3格。
问题3: 为什么要有这样的公式呢?因为C3可能会被扩展出很多,不一定只是由B3扩展出来的,可能还有由A3扩展出来的,我们看一下这个例子10.2c.raq:

这个例子中:A、B、C三列中的内容,都是我们前面学过的,如果你忘了,也正好可以复习一下。A3、B3单元格都是可扩展单元格,其表达式中含有集合函数group、select。
现在预览一下:

D3:=count(C3[B3]{}) 它表示对B3扩展出来的所有C3计数;B3与其扩展出的C3是一一对应的关系,因为按科目分组后,姓名和成绩是一一对应的,所以计数是1。
E3:=count(C3[A3]{}) 它表示对A3扩展出来的所有C3计数;A3与其扩展出的B3是一对四的关系,即每科都有4个同学考试,所以与C3也是一对四的关系,计数是4。
F3:=count(C3[`0]{}) 它表示对全部的C3计数,实际`0就是表示根格,这是一个固定的用法,记住就可以。
上面的坐标层次分了3层,从主格是B3的较小范围的坐标层次,到主格是A3的稍大范围的坐标层次,再到主格是根格的最大范围的坐标层次。
我们通常用的不带花括号的单元格表示法,其实指的是当前层次坐标下的。如我们将上例中d3表达式的方括号去掉,如下图所示:

预览会发现没有什么变化,因为D3是对由B3扩展出的所有C3计数,D3的左主格是B3,所以当前的坐标层次的主格是B3,所以就不需要对层次坐标作定义了。
看明白了这个例子,就明白上面说的b3[`0]。不过,那个公式应该是有条件的,应该是
=count(b3[`0]{b3>?})+1这种样子。
问题4: =count(b3[`0]{b3>?})+1表达式中的?应该是每人自己的成绩,该怎么表示呢?
因为在{}里面,再用b3,就已经是在前面的b3[`0]前提下了,{b3>?}中的b3就是所有的b3,怎么区别所有的b3和当前的b3呢?也即怎么区分所有的成绩和自己的成绩呢?在润乾报表里用$b3来表示“我自己的b3”,即回到主格是B3的较小范围的坐标层次。整个公式是:=count(b3[`0]{b3>$b3})+1。在这里,$就是去掉前面的层次坐标(比如[`0])的作用,相当于直接使用b3。
步骤2: 在c3中输入:=count(b3[`0]{b3>$b3})+1预览如下:

可以这样理解,在使用$时,都是在某些其他主格的作用域内,这时使用$,不考虑前面的作用域,而按照当前格的作用域来选取。
或者说:$Cellx,就是不管它前面的格集、范围等等之类的,就相当于什么其他都没有时,在当前格里直接使用Cellx获得的值。
这里的主格,指的都是左主格,如果是上主格,参见10.3。 ( 下载 )
练习10.21 完成下面的成绩表。 ( 下载 )

提示: 排名是对各科成绩的排名,所以所有的成绩指各科所有的成绩,假设成绩所在单元格为C5,科目所在单元格为A4,各科所有的成绩C5[A4]。排名表达式: =count(C5[A4]{C5>$c5})+1
下一节: 上主格的用法