Consulta final 03/12/06

0 views
Skip to first unread message

Matias Corbanini

unread,
Feb 13, 2011, 4:31:51 PM2/13/11
to FINAL_GDD

Hola a todos! ya que estamos consultando sobre ejercicios, en este
momento estoy viendo como resolver este:

punto 3) b)

desarrolle una consulta que retorne, un renglon por cada empresa, qe
contenga al menos 1 area y que ninguna de las areas tenga mas de 10
empleados con las siguientes columnas: id_empresa, cantidad de areas y
cantidad de empleados.

La cantidad de empleados se refiere a la cantidad de empleados total
por empresa me imagino.
Yo lo tengo resuelto con 2 select anidados en el having pero ahora lo
estoy pensando para no hacer 2 selects anidados.

Creeria que la posta para el filtro de "que ninguna de las areas tenga
mas de 10 empleados" seria en el having.
No les parece?

Espero respuestas.

Saludos y gracias!

Matias.

Matias Corbanini

unread,
Feb 13, 2011, 6:08:35 PM2/13/11
to FINAL_GDD
Bueno gente les comento las 2 alternativas a las cuales llegue.
Lo comparto porque me queme bastante pensandolo y me funcionaron a la
perfeccion las 2, solo que una tiene 2 select anidados y la otra no.

el modelo lo pueden ver directamente del final, pero se los dejo para
que no tengan que moverse mucho:

EMPRESA
AREA EMPLEADO

id_empresa (pk) id_area
(pk) id_area (pk, fk)
--------------------- id_empresa (pk,
fk) id_empresa (pk, fk)
razon_social
-------------------------- cuit (pk)
presidente detalle


el primer select que hice fue: (notese que no puse los guiones bajos
por cuestiones de comodidad)

select e.idempresa, count(distinct(a.idarea)), count(c.idpais)
from empresa as e, area as a, empleado as em
where e.id_empresa = a.id_empresa
AND a.idarea *= em.idarea
AND a.idempresa = em.idempresa
group by e.idempresa
having NOT EXISTS ( select 1 from area as a2
where a2.idempresa = e.idempresa
AND ( select count(*) from empleados as em2
where a2.idarea = em2.idarea AND a2.idempresa = em2.idempresa
) > 10
)


Ahora bien, despues de un rato de limarme, y pensar en alguna forma de
eliminar el select anidado que a mucha gente le cae mal, pude obtener
los mismos resultados, remplazando el having por este

/** lo mismo de arriba hasta el having ** /
having 10 >= ALL ( select count(a2.idarea) from area as a2
where a2.idempresa = e.idempresa
group by a2.idarea )

Al agregar el group by, me devuelve la cantidad de empleados por cada
area, aplicando 10 >= ALL a todo el resultado del select, se filtran
todas aquellas empresas que no tienen ningun area con mas de 10
empleados.

Espero que a alguien le sirva, mas alla del ejercicio en si, esta
bueno ver varias alternativas ante un problema, quiza alguien le salio
de otra forma, estaria bueno que lo compartan.

Saludos!!
Matias.

Matias Corbanini

unread,
Feb 13, 2011, 6:14:31 PM2/13/11
to FINAL_GDD
U perdonen el modelo, se destartalo todo jaja, basicamente es una
entidad Empresa (pk: id_empresa), que tiene Areas(pk: id_empresa,
id_area) y a su vez, las areas tienen empleados (pk: id_empresa,
id_area, cuit)

Javier Hinmel

unread,
Feb 13, 2011, 9:52:02 PM2/13/11
to fina...@googlegroups.com
El problema aca esta en tener que mostrar solo una fila por empresa, sino, en el segundo join (de mi query) no haria falta meter el subselect para poder sumar los empleados.

Esta query devuelve la suma de los empleados de todas las areas de una empresa, las cuales, dichas areas tengan no mas que 10 empleados
El final no lo tengo, solo me base en lo que escribio Matias.

select a.id_empresa, b.cantidad_de_areas, c.cant_empl_areas from empresa a

inner join
    (select id_empresa, count(id_area) as cantidad_de_areas  from area
    group by id_empresa having count(id_area) >= 1) b on a.id_empresa = b.id_empresa

inner join
   (select d.id_empresa, sum(cantidad_de_empleados) as cant_empl_areas from
      (select id_empresa, id_area, count(id_area) as cantidad_de_empleados from empleados
      group by id_empresa, id_area  having count(id_area) <= 10) d group by id_empresa 
   ) c on a.id_empresa = c.id_empresa


Javier.


2011/2/13 Matias Corbanini <mcorban...@gmail.com>

Ivan Hugo Guevara

unread,
Feb 14, 2011, 8:05:30 AM2/14/11
to fina...@googlegroups.com
Pregunta, por que no entiendo bien (no sé si soy medio lento o si tengo mucho sueño :P) . ¿De donde sacas "id_pais"? (select e.idempresa, count(distinct(a.idarea)), count(c.idpais)). Tampoco veo que se haga un join con esa tabla que esta denominada "c".
 
En esta consulta:


having 10 >= ALL ( select count(a2.idarea) from area as a2
                                 where a2.idempresa = e.idempresa
                                 group by a2.idarea )

¿Por que agrupas por a2.idarea?. ¿No debería ir ">"? ("que ninguna de las areas tenga mas de 10 empleados").

Sólo eso.. Gracias
--
Atte. Iván Guevara

Reply all
Reply to author
Forward
0 new messages