Rollup and cube of Oralce advanced SQL

Source: Internet
Author: User
Tags dname

Rollup and cube of Oralce advanced SQL
In oracle SQL query, oracle provides some advanced functions to simplify SQL query statements and improve query performance. The following describes the usage and difference of rollup and cube.

1. rollup


Rollup can calculate the subtotal and total of multiple layers of the specified grouping field in the select statement. rollup is very easy to use and efficient.
Rollup scans the grouping field from right to left and gradually creates a high-level subtotal. finally, create a total row. rollup creates a subtotal for n + 1 level, and n refers to the number of fields in rollup.




1.1 when to use rollup
For subtotal of some level dimensions (calculate the subtotal and total of some level fields) for the statistical summary table in the data warehouse, rollup can simplify the statistical summary table and increase the speed of querying the statistical summary table
1.2 rollup example

 

First, we construct two basic tables: emp (employee table) and dept (Department table ):

SQL> create table emp as select * from scott.emp;Table created.SQL> create table dept as select * from scott.dept;Table created.SQL> select * from emp;     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO---------- ---------- --------- ---------- --------- ---------- ---------- ----------      7369 SMITH      CLERK           7902 17-DEC-80        800                    20      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30      7566 JONES      MANAGER         7839 02-APR-81       2975                    20      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20      7839 KING       PRESIDENT            17-NOV-81       5000                    10      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20      7900 JAMES      CLERK           7698 03-DEC-81        950                    30      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20      7934 MILLER     CLERK           7782 23-JAN-82       1300                    1014 rows selected.SQL> select * from dept;    DEPTNO DNAME          LOC---------- -------------- -------------        10 ACCOUNTING     NEW YORK        20 RESEARCH       DALLAS        30 SALES          CHICAGO        40 OPERATIONS     BOSTON

To calculate the total salary of each job in each department, the SQL statement is as follows:

SQL> select b.dname, a.job, sum(a.sal)  2  from emp a, dept b  3  where a.deptno = b.deptno  4  group by b.dname, a.job;DNAME          JOB       SUM(A.SAL)-------------- --------- ----------SALES          MANAGER         2850SALES          CLERK            950ACCOUNTING     MANAGER         2450ACCOUNTING     PRESIDENT       5000ACCOUNTING     CLERK           1300SALES          SALESMAN        5600RESEARCH       MANAGER         2975RESEARCH       ANALYST         6000RESEARCH       CLERK           19009 rows selected.

If you want to use an SQL statement to count Total salary for each position in each department, Total salary for each departmentAnd Total salaries of all departmentsThen, it is necessary to use a group by statement to calculate the total salary of each department and then combine it with the above results to get the final result. However, in this case, the writing will be more complex than the writing, in addition, the emp and dept tables must be scanned several times. Now oracle provides the rollup clause. Let's take a look at the results of the rollup clause:
SQL> select b.dname, a.job, sum(a.sal)  2  from emp a, dept b  3  where a.deptno = b.deptno  4  group by rollup(b.dname, a.job);DNAME          JOB       SUM(A.SAL)-------------- --------- ----------SALES          CLERK            950SALES          MANAGER         2850SALES          SALESMAN        5600SALES                          9400RESEARCH       CLERK           1900RESEARCH       ANALYST         6000RESEARCH       MANAGER         2975RESEARCH                      10875ACCOUNTING     CLERK           1300ACCOUNTING     MANAGER         2450ACCOUNTING     PRESIDENT       5000ACCOUNTING                     8750                              29025

From the above results, we can see that the rollup clause adds a subtotal for each department and a total line for all departments, that is, the total salary of each department and the total salary of all departments are counted.

Generally, rollup is used together with the group by statement. It is an extension of the group by statement.

 

If the statement is group by rollup (a, B), oracle first performs group by on fields a and B from the right to the left, and then performs group by on field, finally, perform group by for the entire table. If the statement is group by rollup (a, B, c), oracle first performs group by on fields a, B, and c from right to left, then, group by is performed on fields a and B, group by is performed on field a, and group by is performed on the entire table.

 

The following is an example of a rollup field:

 

SQL> select b.dname, a.job, to_char(hiredate, 'yyyy'), sum(sal)  2  from emp a, dept b  3  where a.deptno = b.deptno  4  group by b.dname, a.job, to_char(hiredate, 'yyyy')  5  order by 1, 2, 3;DNAME          JOB       TO_C   SUM(SAL)-------------- --------- ---- ----------ACCOUNTING     CLERK     1982       1300ACCOUNTING     MANAGER   1981       2450ACCOUNTING     PRESIDENT 1981       5000RESEARCH       ANALYST   1981       3000RESEARCH       ANALYST   1987       3000RESEARCH       CLERK     1980        800RESEARCH       CLERK     1987       1100RESEARCH       MANAGER   1981       2975SALES          CLERK     1981        950SALES          MANAGER   1981       2850SALES          SALESMAN  1981       560011 rows selected.SQL> select b.dname, a.job, to_char(hiredate, 'yyyy'), sum(sal)  2  from emp a, dept b  3  where a.deptno = b.deptno  4  group by rollup(b.dname, a.job, to_char(hiredate, 'yyyy'));DNAME          JOB       TO_C   SUM(SAL)-------------- --------- ---- ----------SALES          CLERK     1981        950SALES          CLERK                 950SALES          MANAGER   1981       2850SALES          MANAGER              2850SALES          SALESMAN  1981       5600SALES          SALESMAN             5600SALES                               9400RESEARCH       CLERK     1980        800RESEARCH       CLERK     1987       1100RESEARCH       CLERK                1900RESEARCH       ANALYST   1981       3000RESEARCH       ANALYST   1987       3000RESEARCH       ANALYST              6000RESEARCH       MANAGER   1981       2975RESEARCH       MANAGER              2975RESEARCH                           10875ACCOUNTING     CLERK     1982       1300ACCOUNTING     CLERK                1300ACCOUNTING     MANAGER   1981       2450ACCOUNTING     MANAGER              2450ACCOUNTING     PRESIDENT 1981       5000ACCOUNTING     PRESIDENT            5000ACCOUNTING                          8750                                   2902524 rows selected.

 

Part 1 rollup (Partial rollup)

When you only want to count some fields, you can use some rollup. for example, group by a, rollup (B, c), this statement creates three (2 + 1) level subtotal. they are level (a, B, c), level (a, B), and level ().

 

SQL> select b.dname, a.job, to_char(hiredate, 'yyyy'), sum(sal)  2  from emp a, dept b  3  where a.deptno = b.deptno  4  group by b.dname, rollup(a.job, to_char(hiredate, 'yyyy'));DNAME          JOB       TO_C   SUM(SAL)-------------- --------- ---- ----------SALES          CLERK     1981        950SALES          CLERK                 950SALES          MANAGER   1981       2850SALES          MANAGER              2850SALES          SALESMAN  1981       5600SALES          SALESMAN             5600SALES                               9400RESEARCH       CLERK     1980        800RESEARCH       CLERK     1987       1100RESEARCH       CLERK                1900RESEARCH       ANALYST   1981       3000RESEARCH       ANALYST   1987       3000RESEARCH       ANALYST              6000RESEARCH       MANAGER   1981       2975RESEARCH       MANAGER              2975RESEARCH                           10875ACCOUNTING     CLERK     1982       1300ACCOUNTING     CLERK                1300ACCOUNTING     MANAGER   1981       2450ACCOUNTING     MANAGER              2450ACCOUNTING     PRESIDENT 1981       5000ACCOUNTING     PRESIDENT            5000ACCOUNTING                          875023 rows selected.

From the above results, we can see that some rollup results:

 

Normal summary rows are generated by group by instead of rollup.

 

 

2. cube


Cube allows you to create subtotal for different combinations of specified columns. if the number of specified columns is n, group by cube creates two or more subtotal columns. cube is a grouping statistics statement that is more fine-grained than rollup. First, let's look at the results of the cube statement:

2.1 When to use cube

 

When cross-tabular report (cross report) is required, rollup can simplify the statistical summary table and improve the speed of querying the statistical summary table.

 

2.2 cube example

 

SQL> select b.dname, a.job, sum(a.sal)  2  from emp a, dept b  3  where a.deptno = b.deptno  4  group by cube(b.dname, a.job);DNAME          JOB       SUM(A.SAL)-------------- --------- ----------                              29025               CLERK           4150               ANALYST         6000               MANAGER         8275               SALESMAN        5600               PRESIDENT       5000SALES                          9400SALES          CLERK            950SALES          MANAGER         2850SALES          SALESMAN        5600RESEARCH                      10875RESEARCH       CLERK           1900RESEARCH       ANALYST         6000RESEARCH       MANAGER         2975ACCOUNTING                     8750ACCOUNTING     CLERK           1300ACCOUNTING     MANAGER         2450ACCOUNTING     PRESIDENT       500018 rows selected.

From the above results, we can see that group by cube (B. dname,. the statement first counts the total salary of all departments, and then counts the total salary of each position (. job), and then calculate the total salary of each department (B. dname. dname,. job.

 

 

If the statement is group by cube (a, B), oracle first performs group by on fields a and B, then performs group by on field a, and then performs group by on field B, finally, perform group by for the entire table. If the statement is group by cube (a, B, c), the oracle grouping fields are (a, B, c), (a, B), (a, B), (, c), (B, c), (a), (B), (c), and finally the total for the entire table
The following is an example of three fields in cube:
SQL> select b.dname, a.job, to_char(hiredate, 'yyyy'), sum(sal)  2  from emp a, dept b  3  where a.deptno = b.deptno  4  group by cube(b.dname, a.job, to_char(hiredate, 'yyyy'));DNAME          JOB       TO_C   SUM(SAL)-------------- --------- ---- ----------                                   29025                         1980        800                         1981      22825                         1982       1300                         1987       4100               CLERK                4150               CLERK     1980        800               CLERK     1981        950               CLERK     1982       1300               CLERK     1987       1100               ANALYST              6000               ANALYST   1981       3000               ANALYST   1987       3000               MANAGER              8275               MANAGER   1981       8275               SALESMAN             5600               SALESMAN  1981       5600               PRESIDENT            5000               PRESIDENT 1981       5000SALES                               9400SALES                    1981       9400SALES          CLERK                 950SALES          CLERK     1981        950SALES          MANAGER              2850SALES          MANAGER   1981       2850SALES          SALESMAN             5600SALES          SALESMAN  1981       5600RESEARCH                           10875RESEARCH                 1980        800RESEARCH                 1981       5975RESEARCH                 1987       4100RESEARCH       CLERK                1900RESEARCH       CLERK     1980        800RESEARCH       CLERK     1987       1100RESEARCH       ANALYST              6000RESEARCH       ANALYST   1981       3000RESEARCH       ANALYST   1987       3000RESEARCH       MANAGER              2975RESEARCH       MANAGER   1981       2975ACCOUNTING                          8750ACCOUNTING               1981       7450ACCOUNTING               1982       1300ACCOUNTING     CLERK                1300ACCOUNTING     CLERK     1982       1300ACCOUNTING     MANAGER              2450ACCOUNTING     MANAGER   1981       2450ACCOUNTING     PRESIDENT            5000ACCOUNTING     PRESIDENT 1981       500048 rows selected.

Part 1 cube (partial cube)
Some cubes are similar to some rollup. Placing a column outside the cube operator can limit the subtotal of a column combination. for example, group by a, cube (B, c), this statement will generate a subtotal of 4 (2*2) layers, which are layers (a, B, c ), level (a, B), level (a, c), level ().

SQL> select b.dname, a.job, to_char(hiredate, 'yyyy'), sum(sal)  2  from emp a, dept b  3  where a.deptno = b.deptno  4  group by b.dname, cube(a.job, to_char(hiredate, 'yyyy'));DNAME          JOB       TO_C   SUM(SAL)-------------- --------- ---- ----------SALES                               9400SALES                    1981       9400SALES          CLERK                 950SALES          CLERK     1981        950SALES          MANAGER              2850SALES          MANAGER   1981       2850SALES          SALESMAN             5600SALES          SALESMAN  1981       5600RESEARCH                           10875RESEARCH                 1980        800RESEARCH                 1981       5975RESEARCH                 1987       4100RESEARCH       CLERK                1900RESEARCH       CLERK     1980        800RESEARCH       CLERK     1987       1100RESEARCH       ANALYST              6000RESEARCH       ANALYST   1981       3000RESEARCH       ANALYST   1987       3000RESEARCH       MANAGER              2975RESEARCH       MANAGER   1981       2975ACCOUNTING                          8750ACCOUNTING               1981       7450ACCOUNTING               1982       1300ACCOUNTING     CLERK                1300ACCOUNTING     CLERK     1982       1300ACCOUNTING     MANAGER              2450ACCOUNTING     MANAGER   1981       2450ACCOUNTING     PRESIDENT            5000ACCOUNTING     PRESIDENT 1981       500029 rows selected.

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.