2.4.2 报表显示格式的设计

报表的显示格式是指报表中数据的显示格式。有两条命令用来设计报表的显示格式,它们是COLUMN和BREAK。COLUMN命令用来设计某一列数据的显示格式,而BREAK命令使数据根据某个标准分组显示。

COLUMN命令的作用是设计某一列的显示格式,包括列标题的文字和对齐方式、列数据的宽度和显示格式等。这条命令是比较复杂的,主要表现为它有许多可以使用的选项。读者应该多练习它的使用,注意观察命令执行的结果,从中总结经验。COLUMN命令的格式为:


column列名选项


COLUMN命令的主要选项有以下几个:

·heading:指定列标题的显示文字。

·format:指定列数据的显示格式。

·justify:指定列标题的对齐方式,包括左(left)、居中(center)、右(right)。

·null:当列数据为空时,将显示指定的文本。

·wrapped|truncated:规定当列标题或数据超出规定的宽度时,如何显示。其中wrapped为默认值表示换一行继续显示。Truncated表示截断余下的数据。

其中heading选项用来规定列的标题。默认情况下,列的标题就是列的名字。用户可以定制自己喜欢的列标题。如果列标题中有空格,要用双引号限定。还可以把列标题中的文字分成两行显示,格式是:“第一行文字|第二行文字”。例如,通过下面的命令为ename列定义标题为“姓名”,为sal列定义标题为“工资”。


column ename heading姓名

column sal heading工资


那么,在执行下列SELECT语句时:


SELECT ename, sal FROM emp WHERE empno=7902;

显示的结果为:

姓名 工资


FORD 3000


format选项指定数据的显示格式,主要用来设置字符型、数字型和日期型数据的格式。常用的格式字符串如表2.2所示。

figure_0081_0017

例如,如果通过下列命令为sal列设置了显示格式:


column sal heading 工资 format$999,999.00


那么刚才执行的SELECT语句现在的执行结果为:


姓名 工资


FORD$3,000.00


Justify选项用来指定列标题的对齐方式,可选的对齐方式有左对齐、居中和右对齐三种方式。注意这种对齐方式仅对列标题起作用,并不影响列的数据的对齐方式。

Null选项用来指定当列的数据为空时,应该显示什么样的数据。例如,在显示奖金信息时,如果没有奖金,可以显示为0。

在制作报表时,我们希望属于同一部门的员工数据集中在一起显示,这样我们可以将部门号作为分组的标准,将数据分组显示。如果部门号变化了,可以跳过几行或一页,继续显示另一部门的数据。

BREAK命令的作用就是根据指定的列作为分组标准,将数据分组显示。例如将同一部门的员工集中在一起显示。BREAK命令的格式为:


BREAK ON 列名 措施


其中列名就是被指定为分组标准的列,凡是该列数据相同的数据集中在一起显示。可以选择的措施有以下两个:

·skip行数|PAGE

·noduplicates|duplicates

其中skip选项规定当指定列的值发生变化时,怎样显示后面的数据。可以跳过指定的行数,或者跳过一页,继续显示后面的数据。当把一个正整数作为skip的参数时,跳过这么多行。如果把PAGE作为skip的参数,跳过一页,二者可选其一。

noduplicates(或nodup)和duplicates(或dup)选项规定了是否显示重复的列值。当所有的行以指定的列为标准分组显示时,这个列有许多重复的值。如果使用了nodup选项,将不显示重复值,这是默认的选项,如果使用了dup,将显示重复值。例如,如果以部门号为标准进行分组,那么所有的部门号为10的行集中在一起显示,在这些行中,可以只在第一行显示部门号10,其余行均不显示。当部门号为10的行显示完后,跳过若干行后或一页后,继续显示部门号为20的数据。在所有部门号为20的行中,仍然只在第一行中显示部门号20,其余行均不显示,依此类推。

现在考察下面的例子。我们希望检索工资大于2000的员工,并且以部门号为标准分组显示。构造的BREAK命令和SELECT语句如下所示:


SQL>break on deptno skip 1 nodup

SQL>SELECT deptno, ename, sal FROM emp

WHERE sal>2000

ORDER BY deptno


这条SELECT语句执行的结果为:


deptno ename sal


10 CLARK 2,450.00

KING 5,000.00

20 JONES 2,975.00

FORD 3,000.00

30 BLAKE 2,850.00


应该注意的是,当使用BREAK命令指定了分组标准后,系统是按照被检索的顺序对行进行分组显示的,而不是将数据按照分组标准集中在一起后再显示。所以在SELECT语句中附加ORDER BY子句对行进行排序是必要的。

现在,让我们把COLUMN和BREAK命令综合起来,制作一个比较复杂的报表。制作报表的代码如下:


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

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

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

column dname heading部门名称

column ename heading姓名

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

column comm heading奖金

column loc format a10 heading部门地址

break on dname skip 1 nodup

SELECT dname, ename, sal, comm, loc

FROM emp, dept

WHERE emp.deptno=dept.deptno

ORDER BY emp.deptno;


现在把这段代码存放在一个文本文件中,假设为/home/oracle目录下的report.sql,然后把这个文件加载到缓冲区中,并使之执行,将得到我们希望的报表。生成的报表如下所示:


SQL>@report

蓝天集团员工工资统计表

制表人:SCOTT 页码:1

部门 名称 姓名 工资 奖金 部门地址


ACCOUNTING CLARK$2,450.00 NEW YORK

KING$5,000.00 NEW YORK

MILLER$1,300.00 NEW YORK

RESEARCH SMITH$800.00 DALLAS

FORD$3,000.00 DALLAS

JONES$2,975.00 DALLAS

内部资料 概不对外

蓝天集团员工工资统计表

制表人:SCOTT 页码:2

部门名称 姓名 工资 奖金 部门地址


SALES ALLEN$1,600.00 300 CHICAGO

JAME S$950.00 CHICAGO

TURNER$1,500.00 0 CHICAGO

BLAKE$2,850.00 CHICAGO

MARTIN$1,250.00 1400 CHICAGO

WARD$1,250.00 500 CHICAGO

内部资料 概不对外

已选择12行。


以上生成的报表将在显示器上输出。如果希望把报表保存到文件中,或者直接送到打印机上进行打印,可在SELECT语句之前加上spool命令,以一个文本文件名作为它的参数。在SELECT语句之后再加上一个spool命令,并且以off或out作为它的参数。