Oracle PL/SQL之GROUP BY ROLLUP


ROLLUP字面意思大概就是向上卷,用在GROUP BY 里面可起到累积求和的作用: 

没有ROLLUP的情况下,以下查询按department_id和job_id进行分组求和:

  1. SELECT   department_id, job_id, SUM(salary)  
  2. FROM     employees    
  3. WHERE    department_id < 60  
  4. GROUP BY department_id, job_id;  

Output:

  1. DEPARTMENT_ID,JOB_ID,SUM(SALARY)  
  2. 50,ST_CLERK,55700  
  3. 50,ST_MAN,36400  
  4. 30,PU_CLERK,13900  
  5. 50,SH_CLERK,64300  
  6. 20,MK_MAN,13000  
  7. 30,PU_MAN,11000  
  8. 10,AD_ASST,4400  
  9. 20,MK_REP,6000  
  10. 40,HR_REP,6500  

有ROLLUP的情况下:

先对department_id和job_id进行分组求和,再根据department_id累计求和,最后计算总和:

  1. SELECT   department_id, job_id, SUM(salary)  
  2. FROM     employees    
  3. WHERE    department_id < 60  
  4. GROUP BY ROLLUP(department_id, job_id);  

Output:

  1. DEPARTMENT_ID,JOB_ID,SUM(SALARY)  
  2. 10,AD_ASST,4400  
  3. 10,,4400  
  4. 20,MK_MAN,13000  
  5. 20,MK_REP,6000  
  6. 20,,19000  
  7. 30,PU_MAN,11000  
  8. 30,PU_CLERK,13900  
  9. 30,,24900  
  10. 40,HR_REP,6500  
  11. 40,,6500  
  12. 50,ST_MAN,36400  
  13. 50,SH_CLERK,64300  
  14. 50,ST_CLERK,55700  
  15. 50,,156400  
  16. ,,211200  

先对department_id和job_id进行分组求和,再根据job_id累计求和,最后计算总和:

  1. SELECT   department_id, job_id, SUM (salary)  
  2.     FROM employees  
  3.    WHERE department_id < 60  
  4. GROUP BY ROLLUP (job_id, department_id);  

Output:

  1. DEPARTMENT_ID,JOB_ID,SUM(SALARY)  
  2. 40,HR_REP,6500  
  3. ,HR_REP,6500  
  4. 20,MK_MAN,13000  
  5. ,MK_MAN,13000  
  6. 20,MK_REP,6000  
  7. ,MK_REP,6000  
  8. 30,PU_MAN,11000  
  9. ,PU_MAN,11000  
  10. 50,ST_MAN,36400  
  11. ,ST_MAN,36400  
  12. 10,AD_ASST,4400  
  13. ,AD_ASST,4400  
  14. 30,PU_CLERK,13900  
  15. ,PU_CLERK,13900  
  16. 50,SH_CLERK,64300  
  17. ,SH_CLERK,64300  
  18. 50,ST_CLERK,55700  
  19. ,ST_CLERK,55700  
  20. ,,211200  

相关内容