• 对GROUP BY的增强


    • 使用ROLLUP操作产生求和值
    • 使用CUBE操作产生
    • 使用GROUPING函数确定该行值是由ROLLUP或者CUBE创建的
    • 使用GROUPING SETS生成一个简单的结果集

    1. [oracle@oracle-db-19c ~]$
    2. [oracle@oracle-db-19c ~]$ sqlplus / as sysdba
    3. SQL*Plus: Release 19.0.0.0.0 - Production on Fri Nov 18 10:19:05 2022
    4. Version 19.3.0.0.0
    5. Copyright (c) 1982, 2019, Oracle. All rights reserved.
    6. Connected to:
    7. Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
    8. Version 19.3.0.0.0
    9. SQL>
    10. SQL> alter session set container=PDB1;
    11. Session altered.
    12. SQL> show con_name
    13. CON_NAME
    14. ------------------------------
    15. PDB1
    16. SQL>
    17. SQL>
    18. SQL> conn scott/tiger@PDB1
    19. Connected.
    20. SQL>
    21. SQL> show user
    22. USER is "SCOTT"
    23. SQL>
    24. SQL>
    25. SQL> set pagesize 200
    26. SQL> set linesize 200
    27. SQL> select * from emp;
    28. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    29. ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
    30. 7369 SMITH CLERK 7902 17-DEC-80 800 20
    31. 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
    32. 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
    33. 7566 JONES MANAGER 7839 02-APR-81 2975 20
    34. 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
    35. 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
    36. 7782 CLARK MANAGER 7839 09-JUN-81 2450 10
    37. 7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
    38. 7839 KING PRESIDENT 17-NOV-81 5000 10
    39. 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
    40. 7876 ADAMS CLERK 7788 02-APR-87 1100 20
    41. 7900 JAMES CLERK 7698 03-DEC-81 950 30
    42. 7902 FORD ANALYST 7566 03-DEC-81 3000 20
    43. 7934 MILLER CLERK 7782 23-JAN-82 1300 10
    44. 14 rows selected.
    45. SQL> select deptno,sum(sal) from emp group by deptno;
    46. DEPTNO SUM(SAL)
    47. ---------- ----------
    48. 30 9400
    49. 10 8750
    50. 20 10875
    51. SQL> select deptno,sum(sal) from emp having sum(sal)>9000 group by deptno;
    52. DEPTNO SUM(SAL)
    53. ---------- ----------
    54. 30 9400
    55. 20 10875
    56. SQL> select deptno,job,sum(sal) from emp group by deptno,job;
    57. DEPTNO JOB SUM(SAL)
    58. ---------- --------- ----------
    59. 20 MANAGER 2975
    60. 20 ANALYST 6000
    61. 10 PRESIDENT 5000
    62. 10 CLERK 1300
    63. 30 SALESMAN 5600
    64. 10 MANAGER 2450
    65. 20 CLERK 1900
    66. 30 MANAGER 2850
    67. 30 CLERK 950
    68. 9 rows selected.
    69. SQL> select deptno,job,sum(sal) from emp group by deptno,job order by 1,2;
    70. DEPTNO JOB SUM(SAL)
    71. ---------- --------- ----------
    72. 10 CLERK 1300
    73. 10 MANAGER 2450
    74. 10 PRESIDENT 5000
    75. 20 ANALYST 6000
    76. 20 CLERK 1900
    77. 20 MANAGER 2975
    78. 30 CLERK 950
    79. 30 MANAGER 2850
    80. 30 SALESMAN 5600
    81. 9 rows selected.
    82. SQL>

    带有ROLLUP和CUBE运算符的GROUP BY

    • 带有ROLLUP或者CUBE的GROUP BY 会通过交叉参考列产生一个超级总计行
    • ROLLUP分组生成一个结果集,包含有通常的分组行和求和值
    • CUBE分组生成一个结果集,包含从ROLLUP里面的行和交叉表行。
    1. SQL> select deptno,job,sum(sal) from emp group by rollup(deptno,job) order by 1,2;
    2. DEPTNO JOB SUM(SAL)
    3. ---------- --------- ----------
    4. 10 CLERK 1300
    5. 10 MANAGER 2450
    6. 10 PRESIDENT 5000
    7. 10 8750
    8. 20 ANALYST 6000
    9. 20 CLERK 1900
    10. 20 MANAGER 2975
    11. 20 10875
    12. 30 CLERK 950
    13. 30 MANAGER 2850
    14. 30 SALESMAN 5600
    15. 30 9400
    16. 29025
    17. 13 rows selected.
    18. SQL>
    19. SQL> select deptno,job,sum(sal) from emp group by deptno,job
    20. 2 union all
    21. 3 select deptno,null,sum(sal) from emp group by deptno
    22. 4 union all
    23. 5 select null,null,sum(sal) from emp;
    24. DEPTNO JOB SUM(SAL)
    25. ---------- --------- ----------
    26. 20 MANAGER 2975
    27. 20 ANALYST 6000
    28. 10 PRESIDENT 5000
    29. 10 CLERK 1300
    30. 30 SALESMAN 5600
    31. 10 MANAGER 2450
    32. 20 CLERK 1900
    33. 30 MANAGER 2850
    34. 30 CLERK 950
    35. 30 9400
    36. 10 8750
    37. 20 10875
    38. 29025
    39. 13 rows selected.
    40. SQL>

    rollup(a,b,c)

    group by a

    union all

    group by a,b

    union all

    group by a,b,c

    union all

    total


    cube(a,b,c)

    group by a

    union all

    group by b

    union all

    group by c

    union all

    group by a,b

    union all

    group by a,c

    union all

    group by b,c

    union all

    group by a,b,c

    union all

    total

    1. SQL>
    2. SQL> select deptno,job,sum(sal) from emp group by deptno,job
    3. 2 union all
    4. 3 select deptno,null,sum(sal) from emp group by deptno
    5. 4 union all
    6. 5 select null,null,sum(sal) from emp;
    7. Execution Plan
    8. ----------------------------------------------------------
    9. Plan hash value: 1761893045
    10. ----------------------------------------------------------------------------
    11. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    12. ----------------------------------------------------------------------------
    13. | 0 | SELECT STATEMENT | | 15 | 190 | 11 (19)| 00:00:01 |
    14. | 1 | UNION-ALL | | | | | |
    15. | 2 | HASH GROUP BY | | 11 | 165 | 4 (25)| 00:00:01 |
    16. | 3 | TABLE ACCESS FULL| EMP | 14 | 210 | 3 (0)| 00:00:01 |
    17. | 4 | HASH GROUP BY | | 3 | 21 | 4 (25)| 00:00:01 |
    18. | 5 | TABLE ACCESS FULL| EMP | 14 | 98 | 3 (0)| 00:00:01 |
    19. | 6 | SORT AGGREGATE | | 1 | 4 | | |
    20. | 7 | TABLE ACCESS FULL| EMP | 14 | 56 | 3 (0)| 00:00:01 |
    21. ----------------------------------------------------------------------------
    22. SQL> select deptno,job,sum(sal) from emp group by rollup(deptno,job) order by 1,2;
    23. Execution Plan
    24. ----------------------------------------------------------
    25. Plan hash value: 52302870
    26. -----------------------------------------------------------------------------
    27. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    28. -----------------------------------------------------------------------------
    29. | 0 | SELECT STATEMENT | | 11 | 165 | 4 (25)| 00:00:01 |
    30. | 1 | SORT GROUP BY ROLLUP| | 11 | 165 | 4 (25)| 00:00:01 |
    31. | 2 | TABLE ACCESS FULL | EMP | 14 | 210 | 3 (0)| 00:00:01 |
    32. -----------------------------------------------------------------------------
    33. SQL>

    GROUPING函数

    1. SQL>
    2. SQL> select deptno,job,sum(sal),grouping(deptno),grouping(job) from emp group by rollup(deptno,job);
    3. DEPTNO JOB SUM(SAL) GROUPING(DEPTNO) GROUPING(JOB)
    4. ---------- --------- ---------- ---------------- -------------
    5. 10 CLERK 1300 0 0
    6. 10 MANAGER 2450 0 0
    7. 10 PRESIDENT 5000 0 0
    8. 10 8750 0 1
    9. 20 CLERK 1900 0 0
    10. 20 ANALYST 6000 0 0
    11. 20 MANAGER 2975 0 0
    12. 20 10875 0 1
    13. 30 CLERK 950 0 0
    14. 30 MANAGER 2850 0 0
    15. 30 SALESMAN 5600 0 0
    16. 30 9400 0 1
    17. 29025 1 1
    18. 13 rows selected.
    19. SQL>
    1. SQL> select decode(grouping(deptno)||grouping(job),'01','Subtotal ' || deptno,'11','Total',deptno) deptno,job,sum(sal) from emp group by rollup(deptno,job);
    2. DEPTNO JOB SUM(SAL)
    3. ------------------------------------------------- --------- ----------
    4. 10 CLERK 1300
    5. 10 MANAGER 2450
    6. 10 PRESIDENT 5000
    7. Subtotal 10 8750
    8. 20 CLERK 1900
    9. 20 ANALYST 6000
    10. 20 MANAGER 2975
    11. Subtotal 20 10875
    12. 30 CLERK 950
    13. 30 MANAGER 2850
    14. 30 SALESMAN 5600
    15. Subtotal 30 9400
    16. Total 29025
    17. 13 rows selected.
    18. SQL>
    19. SQL> select decode(grouping(deptno)||grouping(job),'01','Subtotal ' || deptno,'11','Total',deptno) deptno,job,sum(sal),grouping(deptno),grouping(job) from emp group by rollup(deptno,job);
    20. DEPTNO JOB SUM(SAL) GROUPING(DEPTNO) GROUPING(JOB)
    21. ------------------------------------------------- --------- ---------- ---------------- -------------
    22. 10 CLERK 1300 0 0
    23. 10 MANAGER 2450 0 0
    24. 10 PRESIDENT 5000 0 0
    25. Subtotal 10 8750 0 1
    26. 20 CLERK 1900 0 0
    27. 20 ANALYST 6000 0 0
    28. 20 MANAGER 2975 0 0
    29. Subtotal 20 10875 0 1
    30. 30 CLERK 950 0 0
    31. 30 MANAGER 2850 0 0
    32. 30 SALESMAN 5600 0 0
    33. Subtotal 30 9400 0 1
    34. Total 29025 1 1
    35. 13 rows selected.
    36. SQL>

  • 相关阅读:
    向量数据库——AI时代的基座
    dom的基础
    大学生书店系统
    NVIDIA CX 网卡驱动安装 测试
    根据模板动态生成word(一)使用freemarker生成word
    研究生综合英语上第五单元
    简介性能测试
    231.2的幂
    【FI】FB02中Coding Block字段如何设置为可修改
    信号与系统分析《1》
  • 原文地址:https://blog.csdn.net/u011868279/article/details/127917230