Une fonction bien pratique dans ORACLE depuis la version 9i est la fonction ROLLUP, cette fonction permet d'avoir des agrégations a certain niveaux que group by ne permet pas; analysons l'instruction suivante :
SQL> select deptno,job,sum(sal)
2 from emp group by deptno,job
3 order by deptno;
9 ligne(s) sélectionnée(s).
L'agrégation avec GROUP BY dans l'instruction précédente n'est utile que si on veut la somme en fonction des deux colonnes DEPTNO et JOB, si on veut aussi la somme en fonction de chaque DEPTNO nous auront deux choses soit faire une interrogation a part et la joindre avec un l'operateur UNION, soit utilisé la fonction ROLLUP :
SQL> select deptno,job,sum(sal)
2 from emp group by rollup(deptno,job)
3 order by deptno;
13 ligne(s) sélectionnée(s).
Remarquer aussi que la fonction ROLLUP permet de donner un total global de tous les départements, l'utilisation de ROLLUP est équivalent a group by() union group by deptno union group by deptno,job :
SQL> select deptno,job,sum(sal)
2 from emp group by deptno,job
3 union
4 select deptno,to_char(null),sum(sal)
5 from emp group by deptno
6 union
7 select to_number(null),to_char(null),sum(sal)
8 from emp;
13 ligne(s) sélectionnée(s).
Une autre fonction utile est la fonction CUBE.
SQL> select deptno,job,sum(sal)
2 from emp group by deptno,job
3 order by deptno;
DEPTNO | JOB | SUM(SAL) |
---------- | --------- | ---------- |
10 | CLERK | 1300 |
10 | MANAGER | 2450 |
10 | PRESIDENT | 5000 |
20 | ANALYST | 6000 |
20 | CLERK | 1900 |
20 | MANAGER | 2975 |
30 | CLERK | 950 |
30 | MANAGER | 2850 |
30 | SALESMAN | 5600 |
9 ligne(s) sélectionnée(s).
L'agrégation avec GROUP BY dans l'instruction précédente n'est utile que si on veut la somme en fonction des deux colonnes DEPTNO et JOB, si on veut aussi la somme en fonction de chaque DEPTNO nous auront deux choses soit faire une interrogation a part et la joindre avec un l'operateur UNION, soit utilisé la fonction ROLLUP :
SQL> select deptno,job,sum(sal)
2 from emp group by rollup(deptno,job)
3 order by deptno;
DEPTNO | JOB | SUM(SAL) |
---------- | --------- | ---------- |
10 | CLERK | 1300 |
10 | MANAGER | 2450 |
10 | PRESIDENT | 5000 |
10 | 8750 | |
20 | ANALYST | 6000 |
20 | CLERK | 1900 |
20 | MANAGER | 2975 |
20 | 10875 | |
30 | CLERK | 950 |
30 | MANAGER | 2850 |
30 | SALESMAN | 5600 |
30 | 9400 | |
29025 |
13 ligne(s) sélectionnée(s).
Remarquer aussi que la fonction ROLLUP permet de donner un total global de tous les départements, l'utilisation de ROLLUP est équivalent a group by() union group by deptno union group by deptno,job :
SQL> select deptno,job,sum(sal)
2 from emp group by deptno,job
3 union
4 select deptno,to_char(null),sum(sal)
5 from emp group by deptno
6 union
7 select to_number(null),to_char(null),sum(sal)
8 from emp;
DEPTNO | JOB | SUM(SAL) |
---------- | --------- | ---------- |
10 | CLERK | 1300 |
10 | MANAGER | 2450 |
10 | PRESIDENT | 5000 |
10 | 8750 | |
20 | ANALYST | 6000 |
20 | CLERK | 1900 |
20 | MANAGER | 2975 |
20 | 10875 | |
30 | CLERK | 950 |
30 | MANAGER | 2850 |
30 | SALESMAN | 5600 |
30 | 9400 | |
29025 |
13 ligne(s) sélectionnée(s).
Une autre fonction utile est la fonction CUBE.
0 comments:
Enregistrer un commentaire