BREAK ON 與compute語句的使用技巧

一、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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章