33 - Seleccionar grupos (having)


Primer problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes".

1- Créela con la siguiente estructura:
 create table clientes (
  codigo serial,
  nombre varchar(30) not null,
  domicilio varchar(30),
  ciudad varchar(20),
  provincia varchar (20),
  telefono varchar(11),
  primary key(codigo)
);

3- Ingrese algunos registros:
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Lopez Marcos','Colon 111','Cordoba','Cordoba','null');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Perez Ana','San Martin 222','Cruz del Eje','Cordoba','4578585');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Garcia Juan','Rivadavia 333','Villa del Rosario','Cordoba','4578445');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Perez Luis','Sarmiento 444','Rosario','Santa Fe',null);
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Pereyra Lucas','San Martin 555','Cruz del Eje','Cordoba','4253685');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Gomez Ines','San Martin 666','Santa Fe','Santa Fe','0345252525');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Torres Fabiola','Alem 777','Villa del Rosario','Cordoba','4554455');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Lopez Carlos',null,'Cruz del Eje','Cordoba',null);
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Ramos Betina','San Martin 999','Cordoba','Cordoba','4223366');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Lopez Lucas','San Martin 1010','Posadas','Misiones','0457858745');

3- Obtenga el total de los registros agrupados por ciudad y provincia (6 filas)

4- Obtenga el total de los registros agrupados por ciudad y provincia sin considerar los que tienen 
menos de 2 clientes (3 filas)

Ver solución

 drop table if exists clientes;

 create table clientes (
  codigo serial,
  nombre varchar(30) not null,
  domicilio varchar(30),
  ciudad varchar(20),
  provincia varchar (20),
  telefono varchar(11),
  primary key(codigo)
);

 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Lopez Marcos','Colon 111','Cordoba','Cordoba','null');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Perez Ana','San Martin 222','Cruz del Eje','Cordoba','4578585');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Garcia Juan','Rivadavia 333','Villa del Rosario','Cordoba','4578445');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Perez Luis','Sarmiento 444','Rosario','Santa Fe',null);
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Pereyra Lucas','San Martin 555','Cruz del Eje','Cordoba','4253685');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Gomez Ines','San Martin 666','Santa Fe','Santa Fe','0345252525');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Torres Fabiola','Alem 777','Villa del Rosario','Cordoba','4554455');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Lopez Carlos',null,'Cruz del Eje','Cordoba',null);
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Ramos Betina','San Martin 999','Cordoba','Cordoba','4223366');
 insert into clientes(nombre,domicilio,ciudad,provincia,telefono)
  values ('Lopez Lucas','San Martin 1010','Posadas','Misiones','0457858745');

 select ciudad, provincia,
  count(*) as cantidad
  from clientes
  group by ciudad,provincia;

 select ciudad, provincia,
  count(*) as cantidad
  from clientes
  group by ciudad,provincia
  having count(*)>1;

 

Segundo problema:
Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos 
de las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos.

1- Créela con la siguiente estructura:
 create table visitantes(
  nombre varchar(30),
  edad smallint,
  sexo char(1),
  domicilio varchar(30),
  ciudad varchar(20),
  telefono varchar(11),
  montocompra decimal(6,2) not null
 );

2- Ingrese algunos registros:
 insert into visitantes
  values ('Susana Molina',28,'f',null,'Cordoba',null,45.50); 
 insert into visitantes
  values ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba','4545454',22.40);
 insert into visitantes
  values ('Alberto Garcia',35,'m','Gral. Paz 123','Alta Gracia','03547123456',25); 
 insert into visitantes
  values ('Teresa Garcia',33,'f',default,'Alta Gracia','03547123456',120);
 insert into visitantes
  values ('Roberto Perez',45,'m','Urquiza 335','Cordoba','4123456',33.20);
 insert into visitantes
  values ('Marina Torres',22,'f','Colon 222','Villa Dolores','03544112233',95);
 insert into visitantes
  values ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia',null,53.50);
 insert into visitantes
  values ('Roxana Lopez',20,'f','null','Alta Gracia',null,240);
 insert into visitantes
  values ('Liliana Garcia',50,'f','Paso 999','Cordoba','4588778',48);
 insert into visitantes
  values ('Juan Torres',43,'m','Sarmiento 876','Cordoba',null,15.30);

3- Obtenga el total de las compras agrupados por ciudad y sexo de aquellas filas que devuelvan un 
valor superior a 50 (3 filas)

4- Agrupe por ciudad y sexo, muestre para cada grupo el total de visitantes, la suma de sus compras 
y el promedio de compras, ordenado por la suma total y considerando las filas con promedio superior 
a 30 (3 filas)

Ver solución
 drop table if exists visitantes;

 create table visitantes(
  nombre varchar(30),
  edad smallint,
  sexo char(1),
  domicilio varchar(30),
  ciudad varchar(20),
  telefono varchar(11),
  montocompra decimal(6,2) not null
 );

 insert into visitantes
  values ('Susana Molina',28,'f',null,'Cordoba',null,45.50); 
 insert into visitantes
  values ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba','4545454',22.40);
 insert into visitantes
  values ('Alberto Garcia',35,'m','Gral. Paz 123','Alta Gracia','03547123456',25); 
 insert into visitantes
  values ('Teresa Garcia',33,'f',default,'Alta Gracia','03547123456',120);
 insert into visitantes
  values ('Roberto Perez',45,'m','Urquiza 335','Cordoba','4123456',33.20);
 insert into visitantes
  values ('Marina Torres',22,'f','Colon 222','Villa Dolores','03544112233',95);
 insert into visitantes
  values ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia',null,53.50);
 insert into visitantes
  values ('Roxana Lopez',20,'f','null','Alta Gracia',null,240);
 insert into visitantes
  values ('Liliana Garcia',50,'f','Paso 999','Cordoba','4588778',48);
 insert into visitantes
  values ('Juan Torres',43,'m','Sarmiento 876','Cordoba',null,15.30);

 select ciudad,sexo,
  sum(montocompra) as Total
  from visitantes
  group by ciudad,sexo
  having sum(montocompra)>50;

 select ciudad,sexo, count(*) as cantidad,
  sum(montocompra) as total,
  avg(montocompra) as promedio
  from visitantes
  group by ciudad,sexo
  having avg(montocompra)>30
  order by total;

Retornar