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所示。
例如,如果通过下列命令为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作为它的参数。