Ver Mensaje Individual
  #8 (permalink)  
Antiguo 23/04/2014, 08:04
lolo435
 
Fecha de Ingreso: abril-2013
Mensajes: 36
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: ¿Como funciona realmente UNION?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Entendiste que eso no lo hace el UNION?
Ya te lo expliqué:


Tu no estás agrupando sobre el cuarto campo. Lo estás sumando, por consecuencia, agrupa en base a esos tres primeros y suma todos los valores del cuarto campo donde coincidan esos tres.

de todos modos, si tomo tus propios datos, y lo que planteas hacer, el resutlado es el esperado:
Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla1 (
  2.     ->     id_tabla1 INT UNSIGNED PRIMARY KEY,
  3.     ->     cod_cliente INT UNSIGNED,
  4.     ->     servicio VARCHAR(3),
  5.     ->     subservicio VARCHAR(10),
  6.     ->     importe INT
  7.     -> );
  8. Query OK, 0 rows affected (0.44 sec)
  9.  
  10. mysql> INSERT INTO tabla1
  11.     -> VALUES (
  12.     -> 1, 1, 'S12', 'SUB23', 25),
  13.     -> (2, 1, 'S12', 'SUB45', 45),
  14.     -> (3, 1, 'S34', 'SUB78', 78),
  15.     -> (4, 2, 'S12', 'SUB24', 48),
  16.     -> (5, 2, 'S33', 'SUB43', 78);
  17. Query OK, 5 rows affected (0.14 sec)
  18. Records: 5  Duplicates: 0  Warnings: 0
  19.  
  20. mysql>
  21. mysql> CREATE TABLE tabla2 (
  22.     ->     id_tabla2 INT UNSIGNED PRIMARY KEY,
  23.     ->     cod_cliente INT UNSIGNED,
  24.     ->     servicio VARCHAR(3),
  25.     ->     subservicio VARCHAR(10),
  26.     ->     importe INT
  27.     -> );
  28. Query OK, 0 rows affected (0.08 sec)
  29.  
  30. mysql> INSERT INTO tabla2
  31.     -> VALUES (1, 1, 'S12', 'SUB23', 7),
  32.     -> (2, 2, 'S33', 'SUB43', 8);
  33. Query OK, 2 rows affected (0.03 sec)
  34. Records: 2  Duplicates: 0  Warnings: 0
  35.  
  36. mysql>
  37. mysql> SELECT
  38.     ->     cod_cliente, servicio, subservicio, SUM(importe) importe
  39.     -> FROM
  40.     ->     (SELECT
  41.     ->         cod_cliente, servicio, subservicio, importe
  42.     ->     FROM
  43.     ->         tabla1 UNION SELECT
  44.     ->         cod_cliente, servicio, subservicio, importe
  45.     ->     FROM
  46.     ->         tabla2) T3
  47.     -> GROUP BY cod_cliente , servicio , subservicio;
  48. +-------------+----------+-------------+---------+
  49. | cod_cliente | servicio | subservicio | importe |
  50. +-------------+----------+-------------+---------+
  51. |           1 | S12      | SUB23       |      32 |
  52. |           1 | S12      | SUB45       |      45 |
  53. |           1 | S34      | SUB78       |      78 |
  54. |           2 | S12      | SUB24       |      48 |
  55. |           2 | S33      | SUB43       |      86 |
  56. +-------------+----------+-------------+---------+
  57. 5 rows in set (0.09 sec)
Al menos según lo que dices:

O sea que si hay algún defecto, no es en la lógica del UNION, el GROUP BY o los datos. Es otra cosa...

¿Podrías postearnos el CREATE TABLE de las tablas involucradas? Sólo para confirmar...

No son tablas son subconsultas que tienen los campos que he comentado arriba.

Estoy haciendo pruebas y parece que lo voy entendiendo

La unica duda que me queda ( o eso creo jajaj) es lo de:

subconsulta1

UNION

subconsulta2


Vale, coge y agrega todos los registros, pero al final de la UNION agrupo por cod_cliente servicio y subservicio, al agruparlo se queda solo con un registro que contenga estos tres parametros iguales, operando sobre el resto: pudiendo sacar la suma, contar los registros etc etc.

Pero porque mantiene el de la primera consulta? el de subconsulta 1 y si los cambio de orden mantiene el de subconsulta2? Como puedo controlar con que registro de las subconsultas ( los que tienen los tres parametros iguales como comenté) se queda??

Y una ultima cosilla, al unir dos subconsultas, puedo elegir que columna de cada registro mostrar?? Me explico:

subconsulta1

columna1-----columna2----------columna3

1-----------------cliente1-------------test1
2-----------------cliente2-------------test2
3-----------------cliente3-------------test3

subconsulta2

clumna1---------columna2------columna3

1-------------------cliente1-----------test33
2-------------------cliente3-----------test32


subconsulta1

union

subconsulta2


quiero mostrar por ejemplo


columna1-----columna2----------columna3

1-----------------cliente1-------------test33
2-----------------cliente2-------------test2
3-----------------cliente3-------------test32

y ya aprovecho y pregunto otra cosilla voy a agrupar estos dos registros

subconsulta1

columna1-----columna2----------importe--------grupo

1-----------------cliente1-------------2--------------sin grupo
1-----------------cliente1-------------4--------------grupo1

y lo que quiero es

columna1-----columna2----------importe--------grupo

1-----------------cliente1-------------6--------------grupo1



Hay alguna forma de al hacer el group by indicar que ''grupo'' dejar en la agrupacion?

lo he hecho asi

Select solumna1, columna2, sum(importe) as importe, grupo

FROM

(subconsulta1)

GROUP BY columna1, columna2;



mil gracias de nuevo!

Última edición por lolo435; 23/04/2014 a las 08:23