Ver Mensaje Individual
  #5 (permalink)  
Antiguo 23/04/2014, 06:53
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: ¿Como funciona realmente UNION?

Cita:
Union pone todos los registros juntos y despues suma el importe por subservicios, pero no se supone que al hacer la union, solo muestra un registro con el mismo cod_cliente_servicio y subservicio?, me vuelvo a explicar, al hacer la union, no descarta los dos registros de la segunda tabla donde cod_cliente, servicio y subservicio son iguales? o simplemte no los muestra? ( de ser asi entiendo que los suma y muestra el resultado)
Primero: No repitas la información que ya pusiste en el post anterior. Sólo suma texto sin aportar nada nuevo. Trata de poner lo relevante sin copiar y pegar.

Vamos al punto:
Cita:
Union pone todos los registros juntos y despues suma el importe por subservicios, pero no se supone que al hacer la union, solo muestra un registro con el mismo cod_cliente_servicio y subservicio?,
En primer lugar, aparentemente estas confundiendo el "sumar registros" con "sumar datos". y no es lo mismo.
UNION lo que hace es sumar los registros obtenidos en la primera consulta a los registros obtenidos de la segunda, pero no suma los datos. Solo encadena el primer conjunto con el segundo, descartando todos aquellos registros donde todos y cada uno de los datos de cada una de las columnas sean exactamente iguales.
Esto último quiere decir que hace un DISTINCT para el registro entero considerado como un solo objeto.
¿Se entiende?
UNION jamás suma datos, para eso existen las funciones agregadas, más exactamente en este caso, SUM(), que se aplica sobre la columna a sumar.


UNION es, entonces, la representación de una operación de conjuntos (¿recuerdas Teoría de Conjuntos y diagramas de Venn?), donde es A + (B-A) = R

Ahora bien, eso sería el resultado de esto:
Código MySQL:
Ver original
  1. SELECT a, b, c, d
  2. FROM tabla1
  3. SELECT a, b, c, d
  4. FROM tabla2
Pero luego estás haciendo un GROUP BY, y ese GROUP BY se ejecuta sobre la tabla resultante o derivada de ese UNION. Y es allí donde se descartan competamente los resultados de los registros de ese UNION, dejando sólo el primer registro por cada grupo indicado. Pero es allí donde debes sumarlo:

Código MySQL:
Ver original
  1. SELECT a, b, c, SUM(d) d
  2. FROM (SELECT a, b, c, d
  3.   FROM tabla1
  4.   SELECT a, b, c, d
  5.   FROM tabla2) T3
  6. GROUP BY a, b, c
Allí sí se suma el campo "d" devuelto en el UNION.

Ahora bien, si se deben tomar todos los datos de las dos tablas unidas, sin descartar los que tienen valores iguales entre registros, lo que corresponde es usar UNION ALL, y no UNION:
Código MySQL:
Ver original
  1. SELECT a, b, c, SUM(d) d
  2. FROM (SELECT a, b, c, d
  3.   FROM tabla1
  4.   SELECT a, b, c, d
  5.   FROM tabla2) T3
  6. GROUP BY a, b, c

Nota: Todo esto sale perfectamente explicado en el manual de referencia. Deberías usarlo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)