Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] problema consulta con group by

Estas en el tema de problema consulta con group by en el foro de Mysql en Foros del Web. no logro Obtener el nombre de los departamentos que tienen menos de 3 empleados que viven en ciudades distintas. me he quedado atascado sin completar ...
  #1 (permalink)  
Antiguo 26/10/2013, 10:48
 
Fecha de Ingreso: octubre-2013
Ubicación: españa
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
problema consulta con group by

no logro Obtener el nombre de los departamentos que tienen menos de 3 empleados que viven en ciudades distintas.

me he quedado atascado sin completar la consulta:

Código MySQL:
Ver original
  1. select  * from empresa.empleado e inner join empresa.departamento d on e.iddept = d.iddept
  2. group by d.iddept

Última edición por gnzsoloyo; 26/10/2013 a las 11:49
  #2 (permalink)  
Antiguo 26/10/2013, 11:54
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: problema consulta con group by



¿En serio? ¿Te has atascado?
¿Y se te ocurrió usar Google, o al menos consultar el manual de refencia?

Usar HAVING en MySQL
Manual de referencia MySQL: Modificadores del GOUP BY
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 26/10/2013, 14:12
 
Fecha de Ingreso: octubre-2013
Ubicación: españa
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: problema consulta con group by

gracias por tu respuesta.

sí, he buscado en google.
sí, he consultado el manual de referencia.

seguramente no he explicado bien el "atasco"

la consulta me devuelve los departamentos con menos de 3 empleados pero no se discriminar con "ciudades distintas":

disculps por la IGNORANCIA.

select * from empresa.empleado e inner join empresa.departamento d on e.iddept = d.iddept
group by d.iddept, d.nombre_dept
having count(*) <3;
  #4 (permalink)  
Antiguo 26/10/2013, 14:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: problema consulta con group by

Pues para discriminar las ciudades distintas, debes también agrupar por las ciudades. DE lo contrario no las diferenciará.
Código MySQL:
Ver original
  1. from empleado e inner join departamento d on e.iddept = d.iddept
  2. group by d.iddept, e.ciudad_id
  3. HAVING COUNT(*) >= 3
Esto suponiendo que en el empleado tienes un campo ciudad_id, o como sea qu elo identifiques.

Nota: Si cada iddep es único, agrupar por el nombre del departamento es innecesario y superfluo.

Nota 2: No uses "*" para las consultas, especialmente con JOIN. Indica los campos que realmente vas a usar, así te evitas traer columnas repetidas y datos basura (datos que no se usarán en ese proceso).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 26/10/2013, 16:28
 
Fecha de Ingreso: octubre-2013
Ubicación: españa
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: problema consulta con group by

gracias por contestar.

siguiendo tu propuesta la consulta me quedaría así:

Código MySQL:
Ver original
  1. select d.nombre_dept  from empresa.empleado e inner join empresa.departamento d on e.iddept = d.iddept
  2. group by  e.ciudad_empl , d.iddept
  3. having count(*) <3;
pero no me da los departamentos con menos de tres ciudades despues de agrupar

sino las ciudades emparejadas menos de 3 veces con el mismo departamento.
  #6 (permalink)  
Antiguo 26/10/2013, 16:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: problema consulta con group by

En el primer post pides:
Cita:
nombre de los departamentos que tienen menos de 3 empleados que viven en ciudades distintas.
En el último dices:
Cita:
los departamentos con menos de tres ciudades
Son cosas diferentes.
¿Que es exactamente lo que necesitas conseguir?

Nota: Cualquiera que sea la respuesta que nos des, esas consultas no son consultas tan simples como las planteaste. Son mucho más complejas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 27/10/2013, 03:06
 
Fecha de Ingreso: octubre-2013
Ubicación: españa
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: problema consulta con group by

el enunciado dice así: (es un ejercicio del modulo de bases del ciclo de aplicaciones web)

"#17. Obtener el nombre de los departamentos que tienen menos de 3 empleados que viven en ciudades distintas."

en el último post lo que pongo es mi interpretación, aunque no se si tengo razón, xq es un ciclo online y el profesor todavía no me lo ha aclarado, has respondido tu 3 veces antes que mi profesor, lo cual te agradezco sinceramente.

para resumir, lo que intento es agrupar por departamentos y seleccionar los que tienen menos de 3 ciudades distintas.

se puede sacar todo de la tabla empleados (basta con el iddept) sin usar las relacionadas:

Código SQL:
Ver original
  1. CREATE TABLE `empresa`.`empleado` (
  2.   `IDEmpl` INT NOT NULL,
  3.   `nombre_empl` VARCHAR(45) NULL,
  4.   `sueldo` INT NULL,
  5.   `ciudad_empl` VARCHAR(45) NULL,
  6.   `IDDept` INT NULL,
  7.   `IDproy` INT NULL,
  8.   PRIMARY KEY (`IDEmpl`),
  9.   INDEX `IDDept_fk_idx` (`IDDept` ASC),
  10.   INDEX `IDproy_fk_idx` (`IDproy` ASC),
  11.   CONSTRAINT `IDDept_fk`
  12.     FOREIGN KEY (`IDDept`)
  13.     REFERENCES `empresa`.`departamento` (`IdDept`)
  14.     ON DELETE NO ACTION
  15.     ON UPDATE NO ACTION,
  16.   CONSTRAINT `IDproy_fk`
  17.     FOREIGN KEY (`IDproy`)
  18.     REFERENCES `empresa`.`proyecto` (`IDProy`)
  19.     ON DELETE NO ACTION
  20.     ON UPDATE NO ACTION)

Última edición por gnzsoloyo; 27/10/2013 a las 04:55
  #8 (permalink)  
Antiguo 27/10/2013, 04:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: problema consulta con group by

nefes,
como se trata de un ejercicio y es política de este foro no resolverlos, no creo que sea bueno darte la solución, pero sí tratar de orientarte. Está claro que si un empleado solo vive en una ciudad, te toca buscar la cuenta de distintas ciudades (a través de empleados) agrupando por departamento y filtrar con HAVING que esa cuenta sea inferior a 3.
¿Has probado SELECT COUNT(DISTINCT loquesea) ?
Es posible seguramente resolverlo también con subconsultas que incluyan SELECT DISTINCT

Por otra parte está la posibilidad de usar WHERE EXISTS con subconsultas...

Se trata de que pruebes y testees y nos traslades tus dudas y resultados. Ese es el mejor modo de aprender y para eso, como bien sabes, sirven los ejercicios. Realmente, el resultado final no es el objetivo, sino todo lo que se aprende para llegar a él (perdona este rollo docente: es deformación profesional).

Última edición por jurena; 27/10/2013 a las 04:17
  #9 (permalink)  
Antiguo 27/10/2013, 05:07
 
Fecha de Ingreso: octubre-2013
Ubicación: españa
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: problema consulta con group by

coño, gracias jurena, si t tuviera delante t daba un beso, .

he hecho esta consulta y me da el resultado correcto despues de 3 días dandole vueltas, me siento más feliz que un niño en día de reyes.

Código MySQL:
Ver original
  1. select count(distinct e.ciudad_empl) , d.iddept from empresa.empleado e inner join empresa.departamento d on e.iddept = d.iddept
  2. group by   d.iddept
  3. having count(distinct e.ciudad_empl) <3;

ya abusando del personal:

como podría hacer para que solo salga el iddept en el resultado y no la columna count?
  #10 (permalink)  
Antiguo 27/10/2013, 05:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: problema consulta con group by

Si quitas el COUNT() del SELECT y lo dejas en el HAVING, debería ser suficiente. DE lo contrario habrá que hacer una subconsulta en el WHERE.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 27/10/2013, 07:00
 
Fecha de Ingreso: octubre-2013
Ubicación: españa
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: problema consulta con group by

correcto, basta con quitar el count del select y está hecho.

Código MySQL:
Ver original
  1. select d.iddept , d.nombre_dept from empresa.empleado e inner join empresa.departamento d on e.iddept = d.iddept
  2. group by   d.iddept
  3. having count(distinct e.ciudad_empl) <3;

gracias por la ayuda

Última edición por gnzsoloyo; 27/10/2013 a las 07:41
  #12 (permalink)  
Antiguo 27/10/2013, 07:41
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: problema consulta con group by

Por favor, pon los códigos dentro de las etiquetas correspondientes a ese tipo. Para eso está el combo Highlight.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 27/10/2013, 09:29
 
Fecha de Ingreso: octubre-2013
Ubicación: españa
Mensajes: 7
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: problema consulta con group by

entendido
Código MySQL:
Ver original
  1. select 'ok' ;

Etiquetas: group, join, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:42.