Área de Tecnologías de la Información y las Comunicaciones Aplicadas
Área de Tecnologías de la Información y las Comunicaciones Aplicadas Universidad de Murcia
Área de Tecnologías de la Información y las Comunicaciones Aplicadas
ATICA arrow Consultoria arrow DBconnector arrow SQL - Group By avanzado (grouping sets, rollup y cube)
24.05.2012
 
 
SQL - Group By avanzado (grouping sets, rollup y cube) Imprimir E-mail

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

Última modificación ( 17.08.2006 )
 
Área de Tecnologías de la Información y las Comunicaciones Aplicadas
Volver al incio del documento Volver al inicio del documento
Área de Tecnologías de la Información y las Comunicaciones Aplicadas