Oracle PL/SQL/Numeric Math Functions/ROUND

Материал из SQL эксперт
Перейти к: навигация, поиск

ROUND(44.647, -1)

   <source lang="sql">

SQL> SQL> SQL> SELECT ROUND(44.647, -1) AS NEGATIVE FROM Dual;

 NEGATIVE

       40

SQL>


 </source>
   
  


ROUND(5.75)

   <source lang="sql">

SQL> --ROUND(x [, y]) Returns the result of rounding x an optional SQL> -- y decimal places. If y is omitted, x is SQL> -- rounded to zero decimal places. If y is SQL> -- negative, x is rounded to the left of the SQL> -- decimal point. SQL> SQL> select ROUND(5.75) from dual; ROUND(5.75)


         6

SQL>


 </source>
   
  


Round an AVG function

   <source lang="sql">

SQL> -- create demo table SQL> create table Employee(

 2    empno              Number(3)  NOT NULL, -- Employee ID
 3    ename              VARCHAR2(10 BYTE),   -- Employee Name
 4    hireDate          DATE,                -- Date Employee Hired
 5    orig_salary        Number(8,2),         -- Orignal Salary
 6    curr_salary        Number(8,2),         -- Current Salary
 7    region             VARCHAR2(1 BYTE)     -- Region where employeed
 8  )
 9  /

Table created. SQL> SQL> create table job(

 2    empno              Number(3)  NOT NULL, -- Employee ID
 3    jobtitle           VARCHAR2(10 BYTE)    -- Employee job title
 4  )
 5  /

SQL> -- prepare data for employee table SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(122,"Alison",to_date("19960321","YYYYMMDD"), 45000,       48000,       "E")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(123, "James",to_date("19781212","YYYYMMDD"), 23000,       32000,       "W")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(104,"Celia",to_date("19821024","YYYYMMDD"), 53000,       58000,        "E")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(105,"Robert",to_date("19840115","YYYYMMDD"), 31000,      36000,        "W")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(116,"Linda", to_date("19870730","YYYYMMDD"), 43000,       53000,       "E")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(117,"David", to_date("19901231","YYYYMMDD"), 78000,       85000,       "W")
 3  /

1 row created. SQL> insert into Employee(empno, ename, hireDate, orig_salary, curr_salary, region)

 2                values(108,"Jode",  to_date("19960917","YYYYMMDD"), 21000,       29000,       "E")
 3  /

1 row created. SQL> SQL> select * from employee;

    EMPNO ENAME      HIREDATE  ORIG_SALARY CURR_SALARY R

---------- --------- ----------- ----------- -
      122 Alison     21-MAR-96       45000       48000 E
      123 James      12-DEC-78       23000       32000 W
      104 Celia      24-OCT-82       53000       58000 E
      105 Robert     15-JAN-84       31000       36000 W
      116 Linda      30-JUL-87       43000       53000 E
      117 David      31-DEC-90       78000       85000 W
      108 Jode       17-SEP-96       21000       29000 E

7 rows selected. SQL> SQL> -- Query with a ROUND function SQL> SQL> SELECT empno, ename, orig_salary,

 2    ROUND(AVG(orig_salary) OVER()) "Avg. salary"
 3  FROM employee
 4  ORDER BY ename;
    EMPNO ENAME      ORIG_SALARY Avg. salary

---------- ----------- -----------
      122 Alison           45000       42000
      104 Celia            53000       42000
      117 David            78000       42000
      123 James            23000       42000
      108 Jode             21000       42000
      116 Linda            43000       42000
      105 Robert           31000       42000

7 rows selected. SQL> SQL> SQL> SQL> SQL> SQL> -- clean the table SQL> drop table Employee

 2  /

Table dropped. SQL> SQL> SQL>


 </source>
   
  


Round date to day

   <source lang="sql">

SQL> SQL> SELECT ROUND(TO_DATE("25-OCT-2005"), "DD") FROM dual; ROUND(TO_


25-OCT-05

 </source>
   
  


round Demo

   <source lang="sql">
 

SQL> SQL> SELECT ROUND(1234.5678, 4) FROM DUAL; ROUND(1234.5678,4)


        1234.5678

SQL> SELECT ROUND(1234.5678, 3) FROM DUAL; ROUND(1234.5678,3)


         1234.568

SQL> SELECT ROUND(1234.5678, 2) FROM DUAL; ROUND(1234.5678,2)


          1234.57

SQL> SELECT ROUND(1234.5678, 1) FROM DUAL; ROUND(1234.5678,1)


           1234.6

SQL> SELECT ROUND(1234.5678, 0) FROM DUAL; ROUND(1234.5678,0)


             1235

SQL> SELECT ROUND(1234.5678, -1) FROM DUAL; ROUND(1234.5678,-1)


              1230

SQL> SELECT ROUND(1234.5678, -2) FROM DUAL; ROUND(1234.5678,-2)


              1200

SQL> SELECT ROUND(1234.5678, -3) FROM DUAL; ROUND(1234.5678,-3)


              1000

SQL>

 </source>
   
  


Rounding Up and Down

   <source lang="sql">

SQL> SQL> CREATE TABLE SAT (

 2     StudentID  INT NOT NULL,
 3     ExamID     INT NOT NULL,
 4     Mark       INT,
 5     IfPassed   SMALLINT,
 6     Comments   VARCHAR(255),
 7     CONSTRAINT PK_SAT PRIMARY KEY (StudentID, ExamID));

Table created. SQL> SQL> SQL> INSERT INTO SAT (StudentID,ExamID,Mark,IfPassed,Comments) VALUES (1,1,55,1,"Satisfactory"); 1 row created. SQL> INSERT INTO SAT (StudentID,ExamID,Mark,IfPassed,Comments) VALUES (1,2,73,1,"Good result"); 1 row created. SQL> INSERT INTO SAT (StudentID,ExamID,Mark,IfPassed,Comments) VALUES (2,3,44,1,"Hard"); 1 row created. SQL> INSERT INTO SAT (StudentID,ExamID,Mark,IfPassed,Comments) VALUES (2,5,39,0,"Simple"); 1 row created. SQL> INSERT INTO SAT (StudentID,ExamID,Mark,IfPassed) VALUES (2,6,63,1); 1 row created. SQL> SQL> SQL> SELECT StudentID, AVG(CAST(Mark AS FLOAT)) AS AverageMark,

 2         FLOOR(AVG(CAST(Mark AS FLOAT))) AS RoundDown,
 3         CEIL(AVG(CAST(Mark AS FLOAT))) AS RoundUp,
 4         ROUND(AVG(CAST(Mark AS FLOAT)), 0) AS ClosestInt
 5  FROM SAT
 6  GROUP BY StudentID;
STUDENTID AVERAGEMARK  ROUNDDOWN    ROUNDUP CLOSESTINT

----------- ---------- ---------- ----------
        1          64         64         64         64
        2  48.6666667         48         49         49

2 rows selected. SQL> SQL> SQL> SQL> drop table SAT; Table dropped.

 </source>
   
  


ROUND(Number,0)

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table TestTable(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    MyName             VARCHAR2(10 BYTE),
 4    MyDate             DATE,
 5    MyNumber           Number(8,2)
 6  )
 7  /

Table created. SQL> SQL> SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19960711","YYYYMMDD"),12.12); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19970622","YYYYMMDD"),-12.12); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19980513","YYYYMMDD"),22.1); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19990624","YYYYMMDD"),-2.12); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("20000415","YYYYMMDD"),2.1); 1 row created. SQL> SQL> SQL> select * from TestTable; ID MYNAME MYDATE MYNUMBER


---------- --------- ----------

1 Alison 11-JUL-96 12.12 1 Alison 22-JUN-97 -12.12 1 Alison 13-MAY-98 22.1 1 Alison 24-JUN-99 -2.12 1 Alison 15-APR-00 2.1 SQL> SQL> SELECT ID, ROUND(MyNumber,0), TRUNC(MyNumber,0) FROM TestTable; ID ROUND(MYNUMBER,0) TRUNC(MYNUMBER,0)


----------------- -----------------

1 12 12 1 -12 -12 1 22 22 1 -2 -2 1 2 2 SQL> SQL> drop table TestTable; Table dropped. SQL>


 </source>
   
  


ROUND(Number,-1)

   <source lang="sql">

SQL> SQL> SQL> SQL> -- create demo table SQL> create table TestTable(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    MyName             VARCHAR2(10 BYTE),
 4    MyDate             DATE,
 5    MyNumber           Number(8,2)
 6  )
 7  /

Table created. SQL> SQL> SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19960711","YYYYMMDD"),12.12); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19970622","YYYYMMDD"),-12.12); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19980513","YYYYMMDD"),22.1); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19990624","YYYYMMDD"),-2.12); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("20000415","YYYYMMDD"),2.1); 1 row created. SQL> SQL> select * from TestTable; ID MYNAME MYDATE MYNUMBER


---------- --------- ----------

1 Alison 11-JUL-96 12.12 1 Alison 22-JUN-97 -12.12 1 Alison 13-MAY-98 22.1 1 Alison 24-JUN-99 -2.12 1 Alison 15-APR-00 2.1 SQL> SQL> SELECT ID, ROUND(MyNumber,-1), TRUNC(MyNumber,-1) FROM TestTable; ID ROUND(MYNUMBER,-1) TRUNC(MYNUMBER,-1)


------------------ ------------------

1 10 10 1 -10 -10 1 20 20 1 0 0 1 0 0 SQL> SQL> drop table TestTable; Table dropped. SQL> SQL>


 </source>
   
  


ROUND(Number,1): round values from column

   <source lang="sql">

SQL> SQL> SQL> -- create demo table SQL> create table TestTable(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    MyName             VARCHAR2(10 BYTE),
 4    MyDate             DATE,
 5    MyNumber           Number(8,2)
 6  )
 7  /

Table created. SQL> SQL> SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19960711","YYYYMMDD"),12.12); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19970622","YYYYMMDD"),-12.12); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19980513","YYYYMMDD"),22.1); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19990624","YYYYMMDD"),-2.12); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("20000415","YYYYMMDD"),2.1); 1 row created. SQL> SQL> SQL> select * from TestTable; ID MYNAME MYDATE MYNUMBER


---------- --------- ----------

1 Alison 11-JUL-96 12.12 1 Alison 22-JUN-97 -12.12 1 Alison 13-MAY-98 22.1 1 Alison 24-JUN-99 -2.12 1 Alison 15-APR-00 2.1 SQL> SQL> SQL> SQL> SELECT ROUND(MyNumber,1), TRUNC(MyNumber,1) FROM TestTable; ROUND(MYNUMBER,1) TRUNC(MYNUMBER,1)


-----------------
            12.1              12.1
           -12.1             -12.1
            22.1              22.1
            -2.1              -2.1
             2.1               2.1

SQL> SQL> SQL> SQL> SQL> SQL> SQL> drop table TestTable; Table dropped. SQL> SQL>


 </source>
   
  


Round price as new price

   <source lang="sql">

SQL> SQL> create table product(

 2          product_id          integer     primary key
 3          ,price                  number(7,2)
 4          ,description            varchar2(75)
 5          ,onhand                 number(5,0)
 6          ,reorder                number(5,0)
 7          ,supplier_no            integer
 8  );

Table created. SQL> -- product Table Inserts: SQL> insert into product(product_id, price, description, onhand, reorder)values (1,2.50,"Happy Birthday",100,20); 1 row created. SQL> insert into product(product_id, price, description, onhand, reorder)values (2,23.00,"Happy Birthday",null,null); 1 row created. SQL> insert into product(product_id, price, description, onhand, reorder)values (3,null,"Happy New Year",null,null); 1 row created. SQL> insert into product(product_id, price, description, onhand, reorder)values (4,1.50,"Happy New Year",50,10); 1 row created. SQL> SQL> select description, round(price) as price

 2    from product;

DESCRIPTION


    PRICE

Happy Birthday

        3

Happy Birthday

       23

Happy New Year

Happy New Year

        2

4 rows selected. SQL> SQL> drop table product; Table dropped.

 </source>
   
  


Round result from months_between

   <source lang="sql">

SQL> SQL> SQL> select round(months_between("17-MAR-61","21-APR-62"))

 2  from dual;

ROUND(MONTHS_BETWEEN("17-MAR-61","21-APR-62"))


                                          -13

1 row selected. SQL>

 </source>
   
  


ROUND: Returns the number rounded to nearest value (precision adjustable)

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table TestTable(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    MyName             VARCHAR2(10 BYTE),
 4    MyDate             DATE,
 5    MyNumber           Number(8,2)
 6  )
 7  /

Table created. SQL> SQL> SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("1","Alison",to_date("19960711","YYYYMMDD"),12.12); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("2","Jason",to_date("19970622","YYYYMMDD"),-12.12); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("3","Smith",to_date("19980513","YYYYMMDD"),22.1); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("4","Tailor",to_date("19990624","YYYYMMDD"),-2.12); 1 row created. SQL> insert into TestTable (ID, MyName, MyDate, MyNumber) values("5","Darlene",to_date("20000415","YYYYMMDD"),2.1); 1 row created. SQL> SQL> SQL> select * from TestTable; ID MYNAME MYDATE MYNUMBER


---------- --------- ----------

1 Alison 11-JUL-96 12.12 2 Jason 22-JUN-97 -12.12 3 Smith 13-MAY-98 22.1 4 Tailor 24-JUN-99 -2.12 5 Darlene 15-APR-00 2.1 SQL> SQL> SQL> -- ROUND: Returns the number rounded to nearest value (precision adjustable). SQL> SQL> SQL> SQL> select MyNumber, ROUND(MyNumber) from TestTable;

 MYNUMBER ROUND(MYNUMBER)

---------------
    12.12              12
   -12.12             -12
     22.1              22
    -2.12              -2
      2.1               2

SQL> SQL> SQL> SQL> SQL> SQL> drop table TestTable; Table dropped. SQL> SQL>


 </source>
   
  


Rounds 7:45:26 P.M. on May, to the nearest hour

   <source lang="sql">

SQL> SQL> SELECT TO_CHAR(ROUND(TO_DATE("25-MAY-2005 19:45:26","DD-MON-YYYY HH24:MI:SS "), "HH24"), "DD-MON-YYYY HH24:MI:SS") FROM dual; TO_CHAR(ROUND(TO_DAT


25-MAY-2005 20:00:00 SQL> SQL> SQL>

 </source>
   
  


Rounds May, to the first day in the nearest month

   <source lang="sql">

SQL> SQL> SELECT ROUND(TO_DATE("25-MAY-2005"), "MM") FROM dual; ROUND(TO_


01-JUN-05 SQL> SQL>

 </source>
   
  


ROUND with precision

   <source lang="sql">

SQL> SQL> SQL> --Consider the following example: SQL> SQL> SELECT ROUND(44.647, 2) AS POSITIVE FROM Dual;

 POSITIVE

    44.65

SQL>


 </source>
   
  


Simple demo for ROUND: round a number

   <source lang="sql">

SQL> SQL> SQL> SELECT ROUND(44.647, 0) AS ZERO FROM Dual;

     ZERO

       45

SQL>


 </source>
   
  


Specifying negative precision will round numbers on the left side of the decimal point, as shown here:

   <source lang="sql">
 

SQL> SQL> SELECT ROUND(109.09 ,-1) rounded from dual;

  ROUNDED

      110

SQL>

 </source>
   
  


Syntax: ROUND(<numeric expression>,<precision>)

   <source lang="sql">
 

SQL> SQL> SQL> SELECT ROUND(109.09 ,1) rounded from dual;

  ROUNDED

    109.1
  
 </source>
   
  


Use ROUND function in PL/SQL

   <source lang="sql">
 

SQL> SQL> set serveroutput on SQL> SQL> BEGIN

 2     DBMS_OUTPUT.PUT_LINE(ROUND(3.5));
 3     DBMS_OUTPUT.PUT_LINE(ROUND(105.09,1));
 4     DBMS_OUTPUT.PUT_LINE(ROUND(-3.5));
 5     DBMS_OUTPUT.PUT_LINE(ROUND(105.15,-2));
 6     DBMS_OUTPUT.PUT_LINE(ROUND(150.15,-2));
 7  END;
 8  /

4 105.1 -4 100 200 PL/SQL procedure successfully completed. SQL> SQL>

 </source>