Aprende más sobre GROUP BY
En el número de Julio/Agosto de 2005 de Oracle Magazine, viene un artículo en la sección "ASK TOM" que, posiblemente, te enseñe a hacer cosas con GROUP BY que no sabías. Se trata de los modificadores "GROUPING SETS", "ROLLUP" y "CUBE", que junto con GROUP BY pueden ayudarte mucho en la elaboración de informes con agrupaciones.
Veámoslo con un ejemplo sobre la tabla EMP, de la que queremos obtener un informe con la suma de los salarios de los empleados por departamento y puesto. Esto lo podemos hacer con una sencilla consulta que incluya un GROUP BY:
SQL> select deptno,job,sum(sal) from emp group by deptno,job
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
9 rows selected.
¿Qué haríamos si lo que nos piden es un informe donde, en primer lugar, aparezca la suma de los salarios en cada departamento, y seguidamente, la suma de salarios por puesto de trabajo? Lo podemos resolver con GROUPING SETS, simplemente cambiando la expresión GROUP BY:
SQL> select deptno,job,sum(sal) from emp group by grouping sets ((deptno),(job));
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 8750
20 10875
30 9400
ANALYST 6000
CLERK 4150
MANAGER 8275
PRESIDENT 5000
SALESMAN 5600
8 rows selected.
Imaginemos ahora, que nos piden que en el informe aparezca la suma de salarios por departamento y puesto, indicando el total por departamento (al cambiar del mismo) y, finalmente, el total de todos los departamentos. De nuevo lo podemos hacer, sólo cambiando la expresión GROUP BY, en este caso, incluyendo el modificador ROLLUP:
SQL> select deptno,job,sum(sal) from emp group by rollup (deptno,job);
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
30 9400
29025
13 rows selected.
¿Qué más nos pueden pedir? Un informe con el total de salarios por departamento y puesto, que incluya el total por departamento, el total por puesto y total general. Esto lo podemos hacer, una vez más, cambiando sólo la claúsula GROUP BY, usando el modificador CUBE y ordenando por los grupos de agregados (grouping_id):
SQL> select deptno,job,sum(sal) from emp group by cube (deptno,job) order by grouping_id(deptno,job);
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 CLERK 1900
30 CLERK 950
30 SALESMAN 5600
30 MANAGER 2850
20 MANAGER 2975
20 ANALYST 6000
10 8750
20 10875
30 9400
CLERK 4150
ANALYST 6000
MANAGER 8275
PRESIDENT 5000
SALESMAN 5600
29025
18 rows selected.<br/>
<br/>
<br/>
<br/>
Fecha de publicación: 04/07/2005
Autor: Juan Luis Serradilla Amarilla. juanlu@um.es |