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

MYSQL uso de UNION

Estas en el tema de MYSQL uso de UNION en el foro de Mysql en Foros del Web. Buenos días, en mi aplicación de php necesito mostrar en 2 columnas, 2 sumatorios de datos que provienen del mismo campo, pero que dependerá de ...
  #1 (permalink)  
Antiguo 04/09/2012, 04:11
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años
Puntos: 3
MYSQL uso de UNION

Buenos días,

en mi aplicación de php necesito mostrar en 2 columnas, 2 sumatorios de datos que provienen del mismo campo, pero que dependerá de la una cláusula WHERE.
las consultas son:

Código:
SELECT SUM(trabajos.preciototalK25) as preciototalK25, clientes.cliente, proyectos.proyecto, proyectos.WBS, interlocutores.interlocutor FROM ((interlocutores INNER JOIN ((clientes INNER JOIN trabajos ON clientes.Id_cliente = trabajos.cliente) INNER JOIN proyectos ON trabajos.proyecto = proyectos.Id_proyecto) ON interlocutores.Id_inerlocutor = trabajos.interlocutor)) WHERE ((trabajos.f_inicio)>='2012-06-01' And (trabajos.f_inicio)<='2012-6-30' AND (trabajos.estadocliente) = 'SI') GROUP BY clientes.cliente, proyectos.proyecto ORDER BY interlocutores.interlocutor
y
Código:
SELECT SUM(trabajos.preciototalK25) as preciototalESTIMADO, clientes.cliente, proyectos.proyecto, proyectos.WBS, interlocutores.interlocutor FROM ((interlocutores INNER JOIN ((clientes INNER JOIN trabajos ON clientes.Id_cliente = trabajos.cliente) INNER JOIN proyectos ON trabajos.proyecto = proyectos.Id_proyecto) ON interlocutores.Id_inerlocutor = trabajos.interlocutor)) WHERE ((trabajos.f_inicio)>='2012-06-01' And (trabajos.f_inicio)<='2012-6-30') GROUP BY clientes.cliente, proyectos.proyecto ORDER BY interlocutores.interlocutor)
Como véis la única diferencia es que la segunda no incluye la cláusula: (trabajos.estadocliente) = 'SI'

Lo que quiero es poder unir estas dos consultas a través de UNION, para con mi aplicación poder mostrar los datos correctamente.

He probado a hacerlo de la manera que viene a continuación pero me sale el error en el phpmyadmin: Incorrect usage of UNION and ORDER BY
Código:
SELECT SUM(trabajos.preciototalK25) as preciototalK25, clientes.cliente, proyectos.proyecto, proyectos.WBS, interlocutores.interlocutor FROM ((interlocutores INNER JOIN ((clientes INNER JOIN trabajos ON clientes.Id_cliente = trabajos.cliente) INNER JOIN proyectos ON trabajos.proyecto = proyectos.Id_proyecto) ON interlocutores.Id_inerlocutor = trabajos.interlocutor)) WHERE ((trabajos.f_inicio)>='2012-06-01' And (trabajos.f_inicio)<='2012-6-30' AND (trabajos.estadocliente) = 'SI') GROUP BY clientes.cliente, proyectos.proyecto ORDER BY interlocutores.interlocutor UNION (SELECT SUM(trabajos.preciototalK25) as preciototalESTIMADO, clientes.cliente, proyectos.proyecto, proyectos.WBS, interlocutores.interlocutor FROM ((interlocutores INNER JOIN ((clientes INNER JOIN trabajos ON clientes.Id_cliente = trabajos.cliente) INNER JOIN proyectos ON trabajos.proyecto = proyectos.Id_proyecto) ON interlocutores.Id_inerlocutor = trabajos.interlocutor)) WHERE ((trabajos.f_inicio)>='2012-06-01' And (trabajos.f_inicio)<='2012-6-30') GROUP BY clientes.cliente, proyectos.proyecto ORDER BY interlocutores.interlocutor);
Muchas gracias por anticipado
  #2 (permalink)  
Antiguo 04/09/2012, 08:18
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: MYSQL uso de UNION

Hola portela85:

El problema está con el ORDER BY, ya que seguramente dejaste esta ordenación en ambas consultas, sin embargo, en una UNION debe haber UNA SOLA CLÁUSULA, sin embargo, si hay una manera de unir las consultas, sería más o menos así:

Código:
  SELECT .... 
  ... 
  Aquí pones la primer consulta SIN SU ORDER BY
  UNION
  SELECT ...
  ...
  Aquí pones la segunda consulta con EL 
  ORDER BY
Observa que en la consulta SOLO DEBE EXISTIR UN ORDER BY y este se ejecuta DESPUÉS DE HACER LA UNIÓN.

Hay otra manera de hacer esto y sería presentar los resultados de la primer consulta ordenados y después los de la segunda consulta también ordenados, sería más o menos así:

Código:
 SELECT * FROM
( SELECT .... 
  ... 
  Aquí pones la primer consulta con su 
  ORDER BY
  ...
) T1
UNION
( SELECT ...
  ...
  Aquí pones la segunda consulta con su 
  ORDER BY
  ....
) T2
Ahora bien, cambiando un poco de tema, creo que podrías simplificar la consulta y obtener las dos sumatorias en una sola consulta... Tienes muchos paréntesis de más (creo que utilizaste algún tipo de asistente o algo por el estilo), pero podrías intentar hacer algo como esto:

Código MySQL:
Ver original
  1.   SUM(IF(trabajos.estadocliente = 'SI', trabajos.preciototalK25, 0)) preciototalK25,
  2.   SUM(trabajos.preciototalK25) preciototalESTIMADO,
  3.   clientes.cliente,
  4.   proyectos.proyecto,
  5.   proyectos.WBS,
  6.   interlocutores.interlocutor
  7.   interlocutores
  8.   INNER JOIN trabajos ON interlocutores.Id_inerlocutor = trabajos.interlocutor
  9.   INNER JOIN proyectos ON trabajos.proyecto = proyectos.Id_proyecto
  10.   INNER JOIN clientes ON clientes.Id_cliente = trabajos.cliente
  11.   trabajos.f_inicio >= '2012-06-01' AND
  12.   trabajos.f_inicio <='2012-6-30'
  13. GROUP BY clientes.cliente, proyectos.proyecto
  14. ORDER BY interlocutores.interlocutor

Observa que uno de los SUM's es una suma condicional, es decir, solo cuando se cumple la condición trabajos.estadocliente = 'SI' se sumariza.

Dale un vistazo para ver si te sirve el código.

Saludos
Leo.
  #3 (permalink)  
Antiguo 06/09/2012, 06:43
 
Fecha de Ingreso: abril-2011
Mensajes: 103
Antigüedad: 13 años
Puntos: 3
Respuesta: MYSQL uso de UNION

Muchas gracias leonardo_josue,

no estaba usando ningún gestor pero al ver que no me salía me desquicié un poco y me puse a poner paréntesis como un loco... No conocía el recurso del condicional dentro de una consulta de SQL... creo que me puede servir mucho...

gracias de nuevo

Etiquetas: join, php, select, union, campos
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:00.