一、BREAK語句的語法:
BRE[AK] [ON report_element [action [action ]]] ...
where report_element has the syntax {column |expr |ROW|REPORT}
and action has the syntax [SKI[P] n |[SKI[P]] PAGE] [NODUP[LICATES ]|DUP[LICATES]]
Specifies where changes occur in a report and the formatting action to perform, such as:
-
suppressing display of duplicate values for a given column
-
skipping a line each time a given column value changes
-
printing computed figures each time a given column value changes or at the end of the report.
See the COMPUTE command.
Enter BREAK with no clauses to list the current BREAK definition.
二、COMPUTE語句的語法:
COMP[UTE] [function [LAB[EL] text ] ... OF {expr | column | alias } ... ON {expr | column | alias | REPORT | ROW} ...]
In combination with the BREAK command, calculates and prints summary lines , using various standard computations on subsets of selected rows. It also lists all COMPUTE definitions. For details on how to create summaries, see Clarifying Your Report with Spacing and Summary Lines .
Terms
function ...
Represents one of the functions listed in Table 12-2, "COMPUTE Functions" . If you specify more than one function, use spaces to separate the functions.
COMPUTE command functions are always executed in the sequence AVG, COUNT, MINIMUM, MAXIMUM, NUMBER, SUM, STD, VARIANCE, regardless of their order in the COMPUTE command.
Table 12-2 COMPUTE Functions
Function | Computes | Applies to Datatypes |
---|---|---|
AVG |
Average of non-null values |
NUMBER |
COU[NT] |
Count of non-null values |
all types |
MIN[IMUM] |
Minimum value |
NUMBER, CHAR, NCHAR, VARCHAR2 (VARCHAR), NVARCHAR2 (NCHAR VARYING) |
MAX[IMUM] |
Maximum value |
NUMBER, CHAR, NCHAR, VARCHAR2 (VARCHAR), NVARCHAR2 (NCHAR VARYING) |
NUM[BER] |
Count of rows |
all types |
SUM |
Sum of non-null values |
NUMBER |
STD |
Standard deviation of non-null values |
NUMBER |
VAR[IANCE] |
Variance of non-null values |
NUMBER |
簡而言之,我的理解如下:
1. break語句可以對相同的行只顯示一個標題而跳過後面的標題不顯示。
2. compute語句可以在某列的基礎上算一些聚合數值。
以下舉例說明:
三、break語句的使用
以下這段SQL如下:
with test_a as(
select to_date('20080201','yyyymmdd') as yyyymmdd, 'A' as
yingyeyu, '人民幣 ' as shoukfs, 100 as money from dual union all
select to_date('20080201','yyyymmdd') as yyyymmdd, 'A' as
yingyeyu, '信用卡 ' as shoukfs, 100 as money from dual union all
select to_date('20080201','yyyymmdd') as yyyymmdd, 'A' as
yingyeyu, '美金 ' as shoukfs, 100 as money from dual union all
select to_date('20080201','yyyymmdd') as yyyymmdd, 'A' as
yingyeyu, '人民幣 ' as shoukfs, 200 as money from dual union all
select to_date('20080201','yyyymmdd') as yyyymmdd, 'A' as
yingyeyu, '信用卡 ' as shoukfs, 200 as money from dual union all
select to_date('20080201','yyyymmdd') as yyyymmdd, 'A' as
yingyeyu, '美金 ' as shoukfs, 300 as money from dual union all
select to_date('20080201','yyyymmdd') as yyyymmdd, 'B' as
yingyeyu, '人民幣 ' as shoukfs, 100 as money from dual union all
select to_date('20080201','yyyymmdd') as yyyymmdd, 'B' as
yingyeyu, '信用卡 ' as shoukfs, 100 as money from dual union all
select to_date('20080201','yyyymmdd') as yyyymmdd, 'B' as
yingyeyu, '美金 ' as shoukfs, 100 as money from dual union all
select to_date('20080201','yyyymmdd') as yyyymmdd, 'B' as
yingyeyu, '抵值券 ' as shoukfs, 100 as money from dual union all
select to_date('20080202','yyyymmdd') as yyyymmdd, 'B' as
yingyeyu, '人民幣 ' as shoukfs, 200 as money from dual union all
select to_date('20080202','yyyymmdd') as yyyymmdd, 'B' as
yingyeyu, '信用卡 ' as shoukfs, 200 as money from dual union all
select to_date('20080202','yyyymmdd') as yyyymmdd, 'B' as
yingyeyu, '美金 ' as shoukfs, 200 as money from dual union all
select to_date('20080202','yyyymmdd') as yyyymmdd, 'A' as
yingyeyu, '信用卡 ' as shoukfs, 400 as money from dual union all
select to_date('20080202','yyyymmdd') as yyyymmdd, 'A' as
yingyeyu, '美金 ' as shoukfs, 400 as money from dual union all
select to_date('20080202','yyyymmdd') as yyyymmdd, 'B' as
yingyeyu, '人民幣 ' as shoukfs, 300 as money from dual union all
select to_date('20080202','yyyymmdd') as yyyymmdd, 'B' as
yingyeyu, '信用卡 ' as shoukfs, 400 as money from dual union all
select to_date('20080202','yyyymmdd') as yyyymmdd, 'B' as yingyeyu, '美金 ' as shoukfs, 400 as money from dual
)
select yyyymmdd,yingyeyu,shoukfs,sum(money)
from test_a
group by rollup(yyyymmdd,(yingyeyu,shoukfs));
1. 不適用break語句的結果
YYYYMMDD Y SHOUKFS SUM(MONEY)
------------------- - ------- ----------
2008-02-01 00:00:00 A 美金 400
2008-02-01 00:00:00 A 人民幣 300
2008-02-01 00:00:00 A 信用卡 300
2008-02-01 00:00:00 B 抵值券 100
2008-02-01 00:00:00 B 美金 100
2008-02-01 00:00:00 B 人民幣 100
2008-02-01 00:00:00 B 信用卡 100
2008-02-01 00:00:00 1400
2008-02-02 00:00:00 A 美金 400
2008-02-02 00:00:00 A 信用卡 400
2008-02-02 00:00:00 B 美金 600
2008-02-02 00:00:00 B 人民幣 500
2008-02-02 00:00:00 B 信用卡 600
2008-02-02 00:00:00 2500
3900
2. 使用break語句後的結果
在以上那段SQL之前添加
SQL>break on yingyeyu on shoukfs
YYYYMMDD Y SHOUKFS SUM(MONEY)
------------------- - ------- ----------
2008-02-01 00:00:00 A 美金 400
2008-02-01 00:00:00 人民幣 300
2008-02-01 00:00:00 信用卡 300
2008-02-01 00:00:00 B 抵值券 100
2008-02-01 00:00:00 美金 100
2008-02-01 00:00:00 人民幣 100
2008-02-01 00:00:00 信用卡 100
2008-02-01 00:00:00 1400
2008-02-02 00:00:00 A 美金 400
2008-02-02 00:00:00 信用卡 400
2008-02-02 00:00:00 B 美金 600
2008-02-02 00:00:00 人民幣 500
2008-02-02 00:00:00 信用卡 600
2008-02-02 00:00:00 2500
3900
總結:從執行結果可以看出明顯的差異。
四、compute語句的使用。
create table test(
ID VARCHAR2(4 BYTE) NOT NULL,
First_Name VARCHAR2(10 BYTE),
Last_Name VARCHAR2(10 BYTE),
Start_Date DATE,
End_Date DATE,
Salary Number(8,2),
City VARCHAR2(10 BYTE),
Description VARCHAR2(15 BYTE)
)
/
insert into test(ID, First_Name, Last_Name, Start_Date,End_Date, Salary, City,Description)
values ('01','Jason', 'Martin', to_date('19960725','YYYYMMDD'), to_date('20060725','YYYYMMDD'), 1234.56, 'Toronto', 'Programmer');
insert into test(ID, First_Name, Last_Name, Start_Date,End_Date, Salary, City,Description)
values('02','Alison', 'Mathews', to_date('19760321','YYYYMMDD'), to_date('19860221','YYYYMMDD'), 6661.78, 'Vancouver','Tester');
insert into test(ID, First_Name, Last_Name, Start_Date,End_Date, Salary, City,Description)
values('03','James', 'Smith', to_date('19781212','YYYYMMDD'), to_date('19900315','YYYYMMDD'), 6544.78, 'Vancouver','Tester');
insert into test(ID, First_Name, Last_Name, Start_Date,End_Date, Salary, City,Description)
values('04','Celia', 'Rice', to_date('19821024','YYYYMMDD'), to_date('19990421','YYYYMMDD'), 2344.78, 'Vancouver','Manager');
insert into test(ID, First_Name, Last_Name, Start_Date,End_Date, Salary, City,Description)
values('05','Robert', 'Black', to_date('19840115','YYYYMMDD'), to_date('19980808','YYYYMMDD'), 2334.78, 'Vancouver','Tester');
insert into test(ID, First_Name, Last_Name, Start_Date,End_Date, Salary, City, Description)
values('06','Linda', 'Green', to_date('19870730','YYYYMMDD'), to_date('19960104','YYYYMMDD'), 4322.78,'New York', 'Tester');
insert into test(ID, First_Name, Last_Name, Start_Date,End_Date, Salary, City, Description)
values('07','David', 'Larry', to_date('19901231','YYYYMMDD'), to_date('19980212','YYYYMMDD'), 7897.78,'New York', 'Manager');
insert into test(ID, First_Name, Last_Name, Start_Date,End_Date, Salary, City, Description)
values('08','James', 'Cat', to_date('19960917','YYYYMMDD'), to_date('20020415','YYYYMMDD'), 1232.78,'Vancouver', 'Tester');
SQL> select * from test order by 1;
ID FIRST_NAME LAST_NAME START_DATE END_DATE SALARY CITY DESCRIPTION
---- ---------- ---------- ------------------- ------------------- ---------- ---------- ---------------
01 Jason Martin 1996-07-25 00:00:00 2006-07-25 00:00:00 1234.56 Toronto Programmer
02 Alison Mathews 1976-03-21 00:00:00 1986-02-21 00:00:00 6661.78 Vancouver Tester
03 James Smith 1978-12-12 00:00:00 1990-03-15 00:00:00 6544.78 Vancouver Tester
04 Celia Rice 1982-10-24 00:00:00 1999-04-21 00:00:00 2344.78 Vancouver Manager
05 Robert Black 1984-01-15 00:00:00 1998-08-08 00:00:00 2334.78 Vancouver Tester
06 Linda Green 1987-07-30 00:00:00 1996-01-04 00:00:00 4322.78 New York Tester
07 David Larry 1990-12-31 00:00:00 1998-02-12 00:00:00 7897.78 New York Manager
08 James Cat 1996-09-17 00:00:00 2002-04-15 00:00:00 1232.78 Vancouver Tester
-- Multiple COMPUTEs are also allowable.
SET echo off
SET verify off --作用見五所示
BREAK ON city skip1 ON start_date DUPLICATES
COMPUTE sum max min of salary ON city
COMPUTE sum of salary ON id
SELECT id, first_name, salary, city FROM test ORDER BY city,id;
ID FIRST_NAME SALARY CITY
---- ---------- ---------- ----------
06 Linda 4322.78 New York
07 David 7897.78
---------- **********
4322.78 minimum
7897.78 maximum
12220.56 sum
01 Jason 1234.56 Toronto
---------- **********
1234.56 minimum
1234.56 maximum
1234.56 sum
02 Alison 6661.78 Vancouver
03 James 6544.78
04 Celia 2344.78
05 Robert 2334.78
08 James 1232.78
---------- **********
1232.78 minimum
6661.78 maximum
19118.9 sum
結果可以看見了吧。呵呵
五、 SET verify off
關於變量是否顯示改變時的新舊狀態
當在sqlplus中運行的sql語句中有替代變量(以&或&&打頭)的時候,
set verify(或ver) on/off可以設置是否顯示替代變量被替代前後的語句。
如:
SQL> set ver on;
SQL> select * from dual where 1=&var;
Enter value for var: 1
old 1: select * from dual where 1=&var
new 1: select * from dual where 1=1
DU
--
X
而如果設爲off,則顯示如下:
SQL> set ver off;
SQL> select * from dual where 1=&var;
Enter value for var: 1
DU
--
X
部分轉帖自:
http://www.java2s.com/Code/Oracle/PL-SQL/BREAKONcityskip1ONstartdate.htm
http://black-star.javaeye.com/blog/436176