necesito ayuda con este SELECT en sql

bastian
28 de Junio del 2004
hola!

tengo estas 3 tablas:
1) "region" que contiene los campos: id_region y nombre_region
2)"persona" que contiene los campos: id_persona, id_region(fk) y nombre_persona
3)"inscripcion" que contiene los campos:id_persona(fk), id_inscripcion y dias_inscrito

una persona puede estar inscrita en varias listas de inscripcion.
una persona pertenece sólo a una region.

necesito hacer un select que me entregue el nombre de la region que tiene más personas inscritas. he tratado varios pero no lo consigo, alguna idea?, gracias.

b.

lp
28 de Junio del 2004
No sé si has resuelto ya el problema, pero por si acaso, prueba esto:

SELECT id_region, Count(*) FROM Persona
WHERE id_persona IN (SELECT id_persona FROM Inscripcion)
GROUP BY id_region

Esto devuelve cada región con el número de personas que tienen alguna inscripción.

Saludos.

oihgur
28 de Junio del 2004
una persona puede no estar inscrita?
prueba con:

select nombre_region from region where id_region =(
select id_region
from inscripcion i, persona p
where i.id_persona=p.id_persona
group by id_region
having count(*)=(select max(count(*)) from inscripcion i, persona p
where i.id_persona=p.id_persona
group by id_region))

Skakeo
28 de Junio del 2004
Haber con esas tres tablas, la que te interesa es persona:
SELECT count(id_persona), id_region FROM persona
GROUP BY id_region
eso te devolvera la cuenta de personas por region
Un saludo
Skakeo®

bastian
28 de Junio del 2004
hola, lamentablemente el código que me sugirieron no funcionó como yo quiero, el problema es que hay una persona "x" inscrita en 2 listas con lo cual el select devuelve como la región con más inscritos la región donde está esa persona "x". como sea he pensado en una nueva solución, he tenido que cambiar los nombres de las tablas pero lo demás sigue igua, imagina que región ahora se llama "departamento", persona se llama "empleado" y inscripcion se llama "empleado_proyecto". siempre sigo buscando el departamento (en este caso) con más empleados trabajando en proyectos.

hago el siguiente select:

select departamento.nombre_depto, empleado_proyecto.rut_empleado
from departamento ,empleado_proyecto ,empleado
where departamento.codigo_depto=empleado.codigo_depto and
empleado.rut_empleado=empleado_proyecto.rut_empleado
group by departamento.nombre_depto, empleado_proyecto.rut_empleado;

y obtengo esto (rut_empleado equivale a id.persona):

NOMBRE_DEPTO RUT_EMPLEADO
------------------------------ ------------
Finanzas 08.897.030-6
Finanzas 15.598.407-4
Personal 15.133.744-9

hasta acá todo bien pues en verdad Finanzas es el departamento con más empleados trabajando en proyectos, pero debo hacer un select que sólo muestre "Finanzas" como salida. pues bien, modifico el select:

select nombre_depto, count(ep) from(
select departamento.nombre_depto, empleado_proyecto.rut_empleado ep
from departamento ,empleado_proyecto ,empleado
where departamento.codigo_depto=empleado.codigo_depto and
empleado.rut_empleado=empleado_proyecto.rut_empleado
group by departamento.nombre_depto, empleado_proyecto.rut_empleado)
group by nombre_depto;

y obtengo lo siguiente:

NOMBRE_DEPTO COUNT(EP)
------------------------------ ----------
Finanzas 2
Personal 1

lo cual está muy bien ya que efectivamente en Finanzas hay 2 empleados y en Personal sólo una. ahora modifico otra vez el select para que me muestre sólo "Personal":

1er intento:

select nombre_depto, max(count(ep)) from(
select departamento.nombre_depto, empleado_proyecto.rut_empleado ep
from departamento ,empleado_proyecto ,empleado
where departamento.codigo_depto=empleado.codigo_depto and
empleado.rut_empleado=empleado_proyecto.rut_empleado
group by departamento.nombre_depto, empleado_proyecto.rut_empleado)
group by nombre_depto;

la salida es:

SQL> /
select nombre_depto, max(count(ep)) from(
*
ERROR at line 1:
ORA-00937: not a single-group group function

ok, 2º intento:

select nombre_depto, max(cd) from(
select nombre_depto, count(ep) cd from(
select departamento.nombre_depto, empleado_proyecto.rut_empleado ep
from departamento ,empleado_proyecto ,empleado
where departamento.codigo_depto=empleado.codigo_depto and
empleado.rut_empleado=empleado_proyecto.rut_empleado
group by departamento.nombre_depto, empleado_proyecto.rut_empleado)
group by nombre_depto)
group by nombre_depto;

pero la salida sigue siendo:

NOMBRE_DEPTO MAX(CD)
------------------------------ ----------
Finanzas 2
Personal 1

y creo que es porque la persona "x" que está en 2 proyectos está en el departamento Personal y de alguna forma el select considera que Personal tiene 2 empleados cuando sólo tiene uno pero repetido en 2 proyectos (los empleados de Finanzas sólo están en un proyecto cada uno).

bueno, tienen alguna idea para conseguir una manera que el select me entregue esta salida?:

NOMBRE_DEPTO
------------------------------
Finanzas

eso es todo lo que necesito, obtener el nombre del departamento con mas empleados trabajando en algun proyecto.

gracias de antemano, cualquier idea me sirve.

saludos.
.