Listado completo de tutoriales
40 - Modificador del group by (with cube) |
Hemos aprendido el modificador "rollup", que agrega filas extras mostrando resultados de resumen por cada grupo y subgrupo.
Por ejemplo, tenemos una tabla llamada "empleados" que contiene, entre otros, los campos "sexo", "estadocivil" y "seccion".
Si se agrupa por esos tres campos (en ese orden) y se emplea "rollup":
select sexo,estadocivil,seccion, count(*) from empleados group by sexo,estadocivil,seccion with rollup;
SQL Server genera varias filas extras con información de resumen para los siguientes subgrupos:
- sexo y estadocivil (seccion seteado a "null"), - sexo (estadocivil y seccion seteados a "null") y - total (todos los campos seteados a "null").
Si se emplea "cube":
select sexo,estadocivil,seccion, count(*) from empleados group by sexo,estadocivil,seccion with cube;
retorna más filas extras además de las anteriores:
- sexo y seccion (estadocivil seteado a "null"), - estadocivil y seccion (sexo seteado a "null"), - seccion (sexo y estadocivil seteados a "null") y - estadocivil (sexo y seccion seteados a "null"),
Es decir, "cube" genera filas de resumen de subgrupos para todas las combinaciones posibles de los valores de los campos por los que agrupamos.
Se pueden colocar hasta 10 campos en el "group by".
Con "cube" se puede emplear "where" y "having", pero no es compatible con "all".
Ingresemos el siguiente lote de comandos en el SQL Server Management Studio:
if object_id('empleados') is not null drop table empleados; create table empleados ( documento varchar(8) not null, nombre varchar(30), sexo char(1), estadocivil char(1),--c=casado, s=soltero,v=viudo seccion varchar(20), primary key (documento) ); go insert into empleados values ('22222222','Alberto Lopez','m','c','Sistemas'); insert into empleados values ('23333333','Beatriz Garcia','f','c','Administracion'); insert into empleados values ('24444444','Carlos Fuentes','m','s','Administracion'); insert into empleados values ('25555555','Daniel Garcia','m','s','Sistemas'); insert into empleados values ('26666666','Ester Juarez','f','c','Sistemas'); insert into empleados values ('27777777','Fabian Torres','m','s','Sistemas'); insert into empleados values ('28888888','Gabriela Lopez','f','c','Sistemas'); insert into empleados values ('29999999','Hector Garcia','m','c','Administracion'); insert into empleados values ('30000000','Ines Torres','f','c','Administracion'); insert into empleados values ('11111111','Juan Garcia','m','v','Administracion'); insert into empleados values ('12222222','Luisa Perez','f','v','Administracion'); insert into empleados values ('31111111','Marcela Garcia','f','s','Administracion'); insert into empleados values ('32222222','Nestor Fuentes','m','c','Sistemas'); insert into empleados values ('33333333','Oscar Garcia','m','s','Sistemas'); insert into empleados values ('34444444','Patricia Juarez','f','c','Administracion'); insert into empleados values ('35555555','Roberto Torres','m','c','Sistemas'); insert into empleados values ('36666666','Susana Torres','f','c','Administracion'); select sexo,estadocivil,seccion, count(*) from empleados group by sexo,estadocivil,seccion with rollup; select sexo,estadocivil,seccion, count(*) from empleados group by sexo,estadocivil,seccion with cube;