SQL - duda sql

   
Vista:

duda sql

Publicado por Vanessa (1 intervención) el 09/03/2010 13:46:11
Hola a tod@s:

Tengo las siguientes tablas, relacionadas tal y como aparecen:

Vivienda (Portal_pk, tipo_vivienda)

Edificio (Portal_pk, cod_tramo_fk)

Tramo (Cod_tramo_pk, cod_calle_fk)

Calle (Cod_calle_pk, nombre_barrio_fk)

Barrio (nombre_barrio_pk, cod_calle_fk)

Me piden:
Dado un barrio, obtener el TIPO DE VIVIENDA QUE MÁS PREDOMINA.

En mi caso, tengo que sacar los tipos de vivienda, pertenecientes a los edificios que estén en los tramos de las calles del barrio indicado.

He probado con esta select pero sólo me saca los tipos de vivienda que más predominan, no EL QUE MÁS PREDOMINA (DEBER SER ÚNICO)

SELECT COUNT(TIPO_VIVIENDA) AS VECES, TIPO_VIVIENDA, N_PORTAL_FK AS PORTAL
FROM VIVIENDA
GROUP BY TIPO_VIVIENDA, N_PORTAL_FK
HAVING COUNT(TIPO_VIVIENDA) > ANY
(SELECT COUNT(TIPO_VIVIENDA) FROM VIVIENDA GROUP BY TIPO_VIVIENDA)
AND N_PORTAL_FK IN
(SELECT N_PORTAL_PK
FROM EDIFICIO E
WHERE E.COD_TRAMO_FK IN
(SELECT T.COD_TRAMO_PK
FROM TRAMO T
WHERE T.COD_CALLE_FK IN
(SELECT C.COD_CALLE_PK FROM CALLE C WHERE C.NOMBRE_BARRIO_FK = 'SAN ISIDRO')
)
);


Agradecería vuestra ayuda, es importante.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:duda sql

Publicado por Leonardo Josue (877 intervenciones) el 09/03/2010 23:29:42
Buenas Tardes Vanessa... por lo que entendí en tu mensaje la consulta que pones SÍ CONTIENE EL DATO QUE NECESITAS, pero adicionalmente te trae información de más... Dado que necesitas obtener el máximo, entonces creo que puedes hacerlo así:

select A.* from
(
SELECT COUNT(TIPO_VIVIENDA) AS VECES, TIPO_VIVIENDA, N_PORTAL_FK AS PORTAL
FROM VIVIENDA
GROUP BY TIPO_VIVIENDA, N_PORTAL_FK
HAVING COUNT(TIPO_VIVIENDA) > ANY
(SELECT COUNT(TIPO_VIVIENDA) FROM VIVIENDA GROUP BY TIPO_VIVIENDA)
AND N_PORTAL_FK IN
(SELECT N_PORTAL_PK
FROM EDIFICIO E
WHERE E.COD_TRAMO_FK IN
(SELECT T.COD_TRAMO_PK
FROM TRAMO T
WHERE T.COD_CALLE_FK IN
(SELECT C.COD_CALLE_PK FROM CALLE C WHERE C.NOMBRE_BARRIO_FK = 'SAN ISIDRO')
)
)
) A
where A.veces =
(
select max(veces) as veces from
(
SELECT COUNT(TIPO_VIVIENDA) AS VECES, TIPO_VIVIENDA, N_PORTAL_FK AS PORTAL
FROM VIVIENDA
GROUP BY TIPO_VIVIENDA, N_PORTAL_FK
HAVING COUNT(TIPO_VIVIENDA) > ANY
(SELECT COUNT(TIPO_VIVIENDA) FROM VIVIENDA GROUP BY TIPO_VIVIENDA)
AND N_PORTAL_FK IN
(SELECT N_PORTAL_PK
FROM EDIFICIO E
WHERE E.COD_TRAMO_FK IN
(SELECT T.COD_TRAMO_PK
FROM TRAMO T
WHERE T.COD_CALLE_FK IN
(SELECT C.COD_CALLE_PK FROM CALLE C WHERE C.NOMBRE_BARRIO_FK = 'SAN ISIDRO')
)
)
)
)

la verdad está bastante rebuscado y tal vez exista alguna otra opción para optimizar la consulta, pero es lo único que se me ha ocurrido... espero te sirva

Saludos.
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar