SQL - necesito hacer un SELECT que me entregue esto...

 
Vista:

necesito hacer un SELECT que me entregue esto...

Publicado por gastón (1 intervención) el 25/06/2004 10:19:51
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.

g.a.b.
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:necesito hacer un SELECT que me entregue esto..

Publicado por Isaías Islas (5072 intervenciones) el 25/06/2004 17:02:04
Al carecer de datos, no puedo hacer la prueba, digame si fuenciona:

SELECT TOP 1 region.id_region, region.nombre_region, COUNT(inscripcion.id_persona)
FROM region JOIN persona ON region.id_region = persona.id_region
JOIN inscripcion ON inscripcion.id_persona = persona.id_persona
GROUP BY region.id_region, region.nombre_region
ORDER BY 3 DESC
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

RE:necesito hacer un SELECT que me entregue esto..

Publicado por gaston (1 intervención) el 26/06/2004 11:05:35
hola Isaías, lamentablemente tu código 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, tienes 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.

gastón.
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