Ejercicio de final 24-feb 2010

5 views
Skip to first unread message

Diego Navarian

unread,
Feb 13, 2011, 2:16:32 PM2/13/11
to FINAL_GDD
Hola estoy tratando de hace este ejercicio e hice esto

Escriba una consulta ANSI SQL que retorne para todos los países el
nombre del país y el nombre de la ciudad que mas habitantes tiene
sabiendo que no hay 2 ciudades que tengan la misma cantidad de
habitantes.

select pa.nombre, max(ci.habitantes)
from Ciudad ci, Provincia pro, pais pa
where pa.id_pais = ci.id_pais and pro.id_provincia = ci.id_provincia
group by pa.nombre;

El tema es que no se como hacer q me muestre la cuidad tambien porque
cuando la agrego me dice q no es una group by expression

estos son los datos

Gracias

Diego

create table pais
(
id_Pais int,
nombre varchar(100),
primary key (id_Pais)
);


create table Provincia
(
id_Provincia int not null,
id_Pais int not null,
Nombre varchar(100),
primary key (id_Provincia)
);

create table Ciudad
(
id_Ciudad int not null,
id_Provincia int not null,
id_Pais int not null,
Nombre varchar(100),
Habitantes float,
primary key (id_Ciudad)
);

alter table Provincia add foreign key (id_Pais) references pais
(id_Pais);
alter table Ciudad add foreign key (id_Pais) references pais
(id_Pais);
alter table Ciudad add foreign key (id_Provincia) references Provincia
(id_Provincia);



insert into pais (id_Pais, nombre) values (1,'yo');
insert into pais (id_Pais, nombre) values (2,'tu');
insert into pais (id_Pais, nombre) values (3,'el');
insert into pais (id_Pais, nombre) values (4,'nosotros');
insert into pais (id_Pais, nombre) values (5,'ellos');

insert into Provincia (id_Provincia, id_Pais, nombre) values
(11,1,'BsAs');
insert into Provincia (id_Provincia, id_Pais, nombre) values
(12,1,'Chaco');
insert into Provincia (id_Provincia, id_Pais, nombre) values
(13,2,'Mendoza');
insert into Provincia (id_Provincia, id_Pais, nombre) values
(14,2,'Misiones');
insert into Provincia (id_Provincia, id_Pais, nombre) values
(15,3,'Pampa');
insert into Provincia (id_Provincia, id_Pais, nombre) values
(16,3,'Chubut');

insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (100,11,1,'BsAs',500);
insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (101,11,1,'Lanus',600);
insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (102,11,1,'MDQ',800);

insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (200,12,1,'Pepe',100);
insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (201,12,1,'Lala',200);
insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (202,12,1,'juju',300);

insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (300,13,2,'tutu',201);
insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (301,13,2,'lulu',308);
insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (302,13,2,'mimi',1100);

insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (400,14,2,'mutu',205);
insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (401,14,2,'hahaha',2002);
insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (402,14,2,'mutu',1000);

insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (500,15,3,'jtjtjt',400);
insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (501,15,3,'mutu',600);
insert into Ciudad (id_ciudad,id_Provincia, id_Pais,
nombre,habitantes) values (503,15,3,'ruru',700);

Rodrigo Fernandez

unread,
Feb 13, 2011, 2:31:20 PM2/13/11
to fina...@googlegroups.com
Hola ese ejercicio yo lo resolvi con esta consulta:

SELECT p.Nombre_pais, c.Nombre_ciudad

FROM Pais as p, Ciudad as c

WHERE

            c.id_pais = p.id_pais

            AND c.Habitantes = (SELECT MAX(c2.Habitantes)

                                               FROM Ciudad as c2

                                               WHERE c2.id_pais = p.id_pais)


Fijate si con tus datos de prueba funcionan.

Saludos.
--
RoDRigo

Ideas Libres


Matias Corbanini

unread,
Feb 13, 2011, 2:32:25 PM2/13/11
to FINAL_GDD
Hola Diego,

Con respecto a tu select, creo que lo mas natural es hacer un
subselect, en vez del max, mira, yo lo hice asi y me funciono a la
perfeccion:


SELECT p.nombre_pais, ( SELECT e.nombre_ciudad FROM ciudad as c
WHERE c.id_pais = p.id_pais

AND c.habitantes = ( SELECT max(c2.habitantes) FROM ciudad as c2
WHERE c2.id_pais = c.id_pais )
)
FROM pas as p


El primer select, lista los paises, despues, con el segundo subselect,
vas a elegir el nombre de la ciudad que tenga la maxima cantidad de
habitantes, que lo filtras con el segundo subselect.
No se si se entiende.

Yo lo hice asi, y me funciono, no se si se considera como BIEN, o hay
alguna otra forma mejor.

Saludos!

Diego Navarian

unread,
Feb 13, 2011, 3:07:01 PM2/13/11
to fina...@googlegroups.com
buenisimo gracias a ambos

Matias Corbanini

unread,
Feb 13, 2011, 3:40:18 PM2/13/11
to FINAL_GDD
Recien probe el select de rodrigo y me dio bien, como debe ser, e
igual que la mia, aunque el de rodrigo tiene un solo subselect, asi
que la solucion es mejor creeria.

Gracias!

On 13 feb, 17:07, Diego Navarian <navar...@gmail.com> wrote:
> buenisimo gracias a ambos
>
> El 13 de febrero de 2011 16:32, Matias Corbanini
> <mcorbaninica...@gmail.com>escribió:

Diego Navarian

unread,
Feb 13, 2011, 4:01:46 PM2/13/11
to fina...@googlegroups.com
Si a mi tb me anduvo y me parecio mas claro

Javier Hinmel

unread,
Feb 13, 2011, 5:01:02 PM2/13/11
to fina...@googlegroups.com
Ya que esta y para tener diferentes variantes, yo lo resolvi con este query

select p.nombre_pais, c.nombre_ciudad from pais p
inner join (
    select id_pais, max(habitantes) as ciudadConMasHab from ciudad
    group by id_pais
    ) s
on s.id_pais = p.id_pais
inner join ciudad c on c.habitantes = s.ciudadConMasHab

Saludos!

2011/2/13 Diego Navarian <nava...@gmail.com>

Javier Hinmel

unread,
Feb 13, 2011, 6:14:14 PM2/13/11
to fina...@googlegroups.com
Ijo que el ejercicio de Rodrigo tiene un filtro redundante. La query minima es esta

SELECT p.Nombre_pais, c.Nombre_ciudad
FROM pais as p, ciudad as c
WHERE c.Habitantes = (SELECT MAX(Habitantes) FROM Ciudad WHERE id_pais = p.id_pais)


2011/2/13 Javier Hinmel <javier...@gmail.com>

Matias Corbanini

unread,
Feb 13, 2011, 6:19:19 PM2/13/11
to FINAL_GDD
Muy bien! gracias javier! cuando puedas leete el topic que hice
"Consulta final 03/12/06" a ver que te parece la resolucion, para
todos igual, pasa que me lime mucho y quiero ver si hay otras
alternativas tambien.

On 13 feb, 20:14, Javier Hinmel <javierhin...@gmail.com> wrote:
> Ijo que el ejercicio de Rodrigo tiene un filtro redundante. La query minima
> es esta
>
> SELECT p.Nombre_pais, c.Nombre_ciudad
> FROM pais as p, ciudad as c
> WHERE c.Habitantes = (SELECT MAX(Habitantes) FROM Ciudad WHERE id_pais =
> p.id_pais)
>
> 2011/2/13 Javier Hinmel <javierhin...@gmail.com>
>
> > Ya que esta y para tener diferentes variantes, yo lo resolvi con este query
>
> > select p.nombre_pais, c.nombre_ciudad from pais p
> > inner join (
> >     select id_pais, max(habitantes) as ciudadConMasHab from ciudad
> >     group by id_pais
> >     ) s
> > on s.id_pais = p.id_pais
> > inner join ciudad c on c.habitantes = s.ciudadConMasHab
>
> > Saludos!
>
> > 2011/2/13 Diego Navarian <navar...@gmail.com>
>
> > Si a mi tb me anduvo y me parecio mas claro
>
> >> El 13 de febrero de 2011 17:40, Matias Corbanini <
> >> mcorbaninica...@gmail.com> escribió:
Reply all
Reply to author
Forward
0 new messages