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;