您的位置:首页 > 数据库 > Oracle

Oracle PL/SQL之GROUP BY GROUPING SETS

2011-06-12 00:00 309 查看
使用GROUP BY GROUPING SETS相当于把需要GROUP的集合用UNION ALL联合起来。

当GROUPING SETS里面的分组元素越多时,使用GROUPING SETS比使用UNION ALL性能更好,这可能和使用GROUPING SETS只需要访问一次表有关。

如下两段查询的结果是相等的:

q1(GROUPING SETS):

SELECT   department_id, job_id, manager_id, AVG (salary)
FROM employees
GROUP BY GROUPING SETS ((department_id, job_id), (job_id, manager_id));

DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)
------------- ---------- ---------- -----------
SH_CLERK          122        3200
AC_MGR            101       12000
ST_MAN            100        7280
ST_CLERK          121        2675
SA_REP            148        8650
SH_CLERK          120        2900
SH_CLERK          124        2825
MK_MAN            100       13000
AD_PRES                     24000
FI_MGR            101       12000
SA_REP            146        8500
SH_CLERK          123        3475
AD_ASST           101        4400
IT_PROG           102        9000
IT_PROG           103        4950
FI_ACCOUNT        108        7920
PU_MAN            100       11000
ST_CLERK          122        2700
SA_REP            145        8500
AC_ACCOUNT        205        8300
AD_VP             100       17000

DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)
------------- ---------- ---------- -----------
ST_CLERK          120        2625
ST_CLERK          124        2925
SA_REP            147  7766.66667
SA_REP            149  8333.33333
HR_REP            101        6500
PR_REP            101       10000
ST_CLERK          123        3000
SH_CLERK          121        3675
PU_CLERK          114        2780
SA_MAN            100       12200
MK_REP            201        6000
110 AC_ACCOUNT                   8300
90 AD_VP                       17000
50 ST_CLERK                     2785
80 SA_REP                 8396.55172
50 ST_MAN                       7280
80 SA_MAN                      12200
110 AC_MGR                      12000
90 AD_PRES                     24000
60 IT_PROG                      5760
100 FI_MGR                      12000

DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)
------------- ---------- ---------- -----------
30 PU_CLERK                     2780
50 SH_CLERK                     3215
20 MK_MAN                      13000
100 FI_ACCOUNT                   7920
SA_REP                       7000
70 PR_REP                      10000
30 PU_MAN                      11000
10 AD_ASST                      4400
20 MK_REP                       6000
40 HR_REP                       6500

52 rows selected.


q2(UNION ALL):

SELECT   NULL department_id, job_id, manager_id, AVG (salary)
FROM employees
GROUP BY (job_id, manager_id)
UNION ALL
SELECT   department_id, job_id, NULL manager_id, AVG (salary)
FROM employees
GROUP BY (department_id, job_id);

DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)
------------- ---------- ---------- -----------
SH_CLERK          122        3200
AC_MGR            101       12000
ST_MAN            100        7280
ST_CLERK          121        2675
SA_REP            148        8650
SH_CLERK          120        2900
SH_CLERK          124        2825
MK_MAN            100       13000
AD_PRES                     24000
FI_MGR            101       12000
SA_REP            146        8500
SH_CLERK          123        3475
AD_ASST           101        4400
IT_PROG           102        9000
IT_PROG           103        4950
FI_ACCOUNT        108        7920
PU_MAN            100       11000
ST_CLERK          122        2700
SA_REP            145        8500
AC_ACCOUNT        205        8300
AD_VP             100       17000

DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)
------------- ---------- ---------- -----------
ST_CLERK          120        2625
ST_CLERK          124        2925
SA_REP            147  7766.66667
SA_REP            149  8333.33333
HR_REP            101        6500
PR_REP            101       10000
ST_CLERK          123        3000
SH_CLERK          121        3675
PU_CLERK          114        2780
SA_MAN            100       12200
MK_REP            201        6000
110 AC_ACCOUNT                   8300
90 AD_VP                       17000
50 ST_CLERK                     2785
80 SA_REP                 8396.55172
50 ST_MAN                       7280
80 SA_MAN                      12200
110 AC_MGR                      12000
90 AD_PRES                     24000
60 IT_PROG                      5760
100 FI_MGR                      12000

DEPARTMENT_ID JOB_ID     MANAGER_ID AVG(SALARY)
------------- ---------- ---------- -----------
30 PU_CLERK                     2780
50 SH_CLERK                     3215
20 MK_MAN                      13000
100 FI_ACCOUNT                   7920
SA_REP                       7000
70 PR_REP                      10000
30 PU_MAN                      11000
10 AD_ASST                      4400
20 MK_REP                       6000
40 HR_REP                       6500

52 rows selected.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: