2.4.3 如何对特定列进行统计

以前介绍的报表仅仅从数据库中检索数据,然后按照指定的格式显示出来。如果要对报表中的数据进行统计,就要借助于SQL*Plus的另外一条命令:COMPUTE。

一般情况下,对报表的统计不外乎两种形式,即水平统计和垂直统计。水平统计是把一行中的几个列的值进行计算,例如,求公司中每个员工的工资和奖金之和。这种统计比较简单,通过SELECT语句就可以实现。例如,下列SELECT语句将计算每个员工的工资和奖金之和:


SELECT sal+nvl(comm,0)AS收入FROM emp;


垂直统计是对报表中某个特定列的值进行某种计算。例如公司所有员工的工资总和,或者某个部门中所有员工的奖金之和。这种统计是比较复杂的,通过SQL*Plus的COMPUTE命令可以实现这种统计。

COMPUTE命令的格式为:


compute函数label标签文字of列名on列名


其中函数指定对数据进行什么样的统计。COMPUTE命令可以实现的统计有SUM(求和)、AVG(求平均值)、MIN(求最小值)、MAX(求最大值)和COUNT(计数)。

Label选项指定了一个字符串,用来在计算所得的数据之前显示。例如,对某列进行SUM统计的数据之前可以显示“总计”,在AVG统计的数据之前可以显示“平均”等。默认情况下显示的信息是所使用的函数名称,如sum、avg。

Of选项指定了一个列名,COMPUTE命令对这个列的数据进行计算,计算的结果显示在这个列的正下方。需要注意的是,这个列的数据类型必须能够进行指定的计算。

On选项之后也指定了一个列名。COMPUTE命令根据这个列对数据进行分组统计。COMPUTE命令通常是和BREAK命令配合使用的,BREAK命令对数据进行分组显示,而COMPUTE命令对分组后的数据分别进行计算。例如,我们可以将员工的数据按照部门号进行分别显示,然后按照分组的结果对各部门分别进行统计。例如,要对各部门员工的工资分别求和,相应的COMPUTE命令为:


compute sum label总计of sal on depnto


计算的结果显示在每个部门员工数据之后,被计算列的正下方。

现在,我们把与报表有关的几个重要命令综合起来,制作一个完整的报表。假设制作报表的所有命令存放在文本文件report.sql中,这个文件的内容为:


ttitle center蓝天集团员工工资统计表skip 2 left-

制表人:sql.user format 99 right页码:sql.pno

btitle skip 1 center"内部资料概不对外"

column dname heading部门名称

column ename heading姓名

column sal format$999,999.00 heading工资justify center

column comm format$9999.00 heading奖金

column收入format$999,999.00

break on dname skip 1 nodup

compute sum label总计of sal on dname

compute sum of comm on dname

compute sum of收入on dname

spool wwww

SELECT dname, ename, sal, comm, sal+nvl(comm,0)as收入

FROM emp, dept

WHERE emp.deptno=dept.deptno

order by emp.deptno;

spool off


这样在将这个文件读到缓冲区中并执行时,将生成希望的报表,并将报表存放到当前目录下的文件www.lst中。报表的内容为:


蓝天集团员工工资统计表

制表人:SCOTT 页码:1

部门名称 姓名 工资 奖金 收入


ACCOUNTING CLARK$2,450.00$2,450.00

KING$5,000.00$5,000.00

MILLER$1,300.00$1,300.00

RESEARCH SMITH$800.00$800.00

FORD$3,000.00$3,000.00

JONES$2,975.00$2,975.00


总计$15,525.00$15,525.00

内部资料概不对外

蓝天集团员工工资统计表

制表人:SCOTT 页码:2

部门名称 姓名 工资 奖金 收入


SALES ALLEN$1,600.00$300.00$1,900.00

JAMES$950.00$950.00

TURNER$1,500.00$.00$1,500.00

BLAKE$2,850.00$2,850.00

MARTIN$1,250.00$1400.00$2,650.00

WARD$1,250.00$500.00$1,750.00


总计$9,400.00$2,200.00$11,600.00

内部资料 概不对外