MySQL - Consulta UNION ALL

 
Vista:
sin imagen de perfil

Consulta UNION ALL

Publicado por Cmedina (3 intervenciones) el 06/06/2018 02:21:17
Hola, quiero obtener las horas de los trabajadores de distintas tablas mysql, hasta ahora, no he conseguido agrupar al tabajador y sumar las horas en los distintos trabajos, a ver si me echais un cable, el codigo es este:

SELECT operario, sum(Horas) FROM horascdot
UNION ALL
SELECT operario, sum(Horas) FROM horaspreparacion
UNION ALL
SELECT operario, sum(Horas) FROM horasimprimacion
UNION ALL
SELECT operario, sum(Horas) FROM horasintermedia
UNION ALL
SELECT operario, sum(Horas) FROM horasacabado
UNION ALL
SELECT operario, sum(Horas) FROM horasotros
GROUP BY operario

cuando ejecuto la consulta, no agrupa al operario. y obtengo el siguiente resultado:
13 3.00
13 1.00
NULL NULL
NULL NULL
NULL NULL
11 1.00

tambien quisiera evitar los NULL
saludos y gracias
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta UNION ALL

Publicado por leonardo_josue (414 intervenciones) el 06/06/2018 15:42:47
Hola Cmedina:

El "problema" es que la agrupación que estás haciendo se hace sólo sobre la última consulta, no sobre el resultado de la unión... Tal como lo tienes MySQL no puede determinar que la agrupación es "general" ya que por naturaleza, cada SELECT puede tener su propia agrupación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT operario, sum(Horas) FROM horascdot
GROUP BY operario
UNION ALL
SELECT operario, sum(Horas) FROM horaspreparacion
GROUP BY operario
UNION ALL
SELECT operario, sum(Horas) FROM horasimprimacion
GROUP BY operario
UNION ALL
SELECT operario, sum(Horas) FROM horasintermedia
GROUP BY operario
UNION ALL
SELECT operario, sum(Horas) FROM horasacabado
GROUP BY operario
UNION ALL
SELECT operario, sum(Horas) FROM horasotros
GROUP BY operario --> En este caso, la agrupación corresponde sólo al último SELECT<--

Si la agrupación la requieres hacer sobre el resultado de la UNION, entonces primero tienes que asegurarte que esta se ejecute, haciéndolo por ejemplo con una subconsulta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT operario, SUM(horas) total_horas
FROM
( SELECT operario, Horas FROM horascdot
  UNION ALL
  SELECT operario, Horas FROM horaspreparacion
  UNION ALL
  SELECT operario, Horas FROM horasimprimacion
  UNION ALL
  SELECT operario, Horas FROM horasintermedia
  UNION ALL
  SELECT operario, Horas FROM horasacabado
  UNION ALL
  SELECT operario, Horas FROM horasotros
) T
GROUP BY T.operario;

Haz la prueba y nos comentas.

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
sin imagen de perfil

Consulta UNION ALL

Publicado por CMedina (3 intervenciones) el 07/06/2018 11:35:35
Todo OK Gracias.
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