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

[SOLUCIONADO] ¿Como funciona realmente UNION?

Estas en el tema de ¿Como funciona realmente UNION? en el foro de Mysql en Foros del Web. Si, se que une el resultado de dos tablas, pero me he fijado en que si un registro esta en la primera tabla, y en ...
  #1 (permalink)  
Antiguo 23/04/2014, 01:05
 
Fecha de Ingreso: abril-2013
Mensajes: 36
Antigüedad: 11 años, 7 meses
Puntos: 0
¿Como funciona realmente UNION?

Si, se que une el resultado de dos tablas, pero me he fijado en que si un registro esta en la primera tabla, y en la segunda hay un registro con los mismos valores en las columnas que al final de la consulta agrupo, solo me pone el de la primera tabla. Me explico mejor con un ejemplo.

Supongo que tengo una subconsulta , subconsulta1 tal que:

colum 1---colum2-----colum3----colum 4

test1-----nombre1---apellido1---4
test2-----nombre2---apellido2---5
test3-----nombre3---apellido3---7


La subconsulta2 es del tipo ( con las mismas columnas y el mismo tipo de datos)

colum 1----colum2-----colum3----colum 4

test1------nombre1---apellido1-----45
test3------nombre3---apellido3-----12
test5------nombre5---apellido5-----14


La union la hago asi:

SELECT colum1,colum2,colum3,colum4

FROM

(

(subconsulta1)

UNION

(subconsulta2)

) union_subconsultas

GROUP BY colum1,colum2,colum3


El resultado es este

colum 1---colum2-----colum3----colum 4

test1-----nombre1---apellido1---4
test2-----nombre2---apellido2---5
test3-----nombre3---apellido3---7
test5-----nombre5---apellido5---14

Al hacer la union coge de la primera tabla los registros.

Hay alguna manera de poder seleccionas que registro de cada tabla mostrar?

Incluso que columna de cada subconsulta?

Si alguien esta enterado de como funciona UNION en todos sus aspectos y puede explicarme un poco le estaré muy a gradecido!!

Muchas gracias!
  #2 (permalink)  
Antiguo 23/04/2014, 01:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: ¿Como funciona realmente UNION?

echa un vistazo al empleo de
UNION ALL
y UNION DISTINCT o UNION
cita
Cita:
Si no usa la palabra clave ALL para UNION, todos los registros retornados son únicos, como si hubiera hecho un DISTINCT para el conjunto de resultados total. Si especifica ALL, obtiene todos los registros coincidentes de todos los comandos SELECT usados.
http://dev.mysql.com/doc/refman/5.0/es/union.html

respecto a lo otro que preguntas, claro que puedes escoger la columna que desees, pero a la hora de unirla con otra, ambas deben ser del mismo tipo. También puedes seleccionar mediante filtrado con WHERE cada una de las consultas, pero debes encerrarlas entre paréntesis. Y en ocasiones hay que usar alias
Código MySQL:
Ver original
  1. SELECT t1.campo1, t1.campo2, t1.campo3 FROM  ((SELECT campo1, campo2, campo3 FROM tabla1 WHERE ...)
  2. (SELECT campo1, campo2, campo3 FROM tabla2 WHERE...))t1
Pero dinos exactamente qué datos tienes con ejemplos concretos y qué debería salir. Así podremos ayudarte mejor porque lo mismo para lo que quieres la solución no es una consulta con UNION.

Última edición por jurena; 23/04/2014 a las 01:37
  #3 (permalink)  
Antiguo 23/04/2014, 04:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: ¿Como funciona realmente UNION?

El problema que yo veo es que estás usando un GROUP BY sobre tres de las cuatro columnas, por lo que devolverá sólo un registro por cada combinación distinta de esas TRES columnas, y no de todas.
¿Cuál sería, según tu, el resultado que deberías obtener de salida?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 23/04/2014, 06:17
 
Fecha de Ingreso: abril-2013
Mensajes: 36
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: ¿Como funciona realmente UNION?

lo que quiero que ocurra se hace, es tal y como os e enseñado, quiero que si existe un registro en la subconsulta2 con los mismos parametros por los que agrupo, sea ''machacado'' por el registro de la subconsulta 1. Pero queria enterarme bien de como funciona UNION, ya que lo que hago, solo pasa si pongo la union en este orden

subconsulta1

union

subconsulta2


si las pongo alrreves se hace al contrario.






Al igual que este ejemplo queria operar con dos subconsultas, os explico:

tengo la subconsulta1 de esta forma


cod_cliente-----servicio-----subservicio-----importe
1---------------------S12-----------SUB23---------25
1---------------------S12-----------SUB45---------45
1---------------------S34-----------SUB78---------78
2---------------------S12-----------SUB24---------48
2---------------------S33-----------SUB43---------78


subconsulta2

cod_cliente-----servicio-----subservicio-----importe
1---------------------S12-----------SUB23---------7
2---------------------S33-----------SUB43---------8


lo que quiero es unir las dos subconsultas y sumar el importe, para que quede de esta forma

cod_cliente-----servicio-----subservicio-----importe
1---------------------S12-----------SUB23---------32
1---------------------S12-----------SUB45---------45
1---------------------S34-----------SUB78---------78
2---------------------S12-----------SUB24---------48
2---------------------S33-----------SUB43---------86


tb lo he hecho con union, y me ha salido bien, pero no se muy bien como funciona, de ahi mis dudas

la consulta la he hecho asi

SELECT cod_cliente,servicio,subservicio,SUM(importe) AS importe

FROM

(

(subconsulta2)

UNION

(subconsulta1)

) consulta_union

GROUP BY cod_cliente, servicio, subservicio;


Lo que me gustaria saber es como funciona

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)

Un saludo y gracias de nuevo!
  #5 (permalink)  
Antiguo 23/04/2014, 06:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
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)
  #6 (permalink)  
Antiguo 23/04/2014, 07:20
 
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
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:

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.


Ya ya, si se que union no suma nada, eso lo hago yo. A lo que me refiero es que union une las dos tablas y dependiendo si es all o no, muestra todos los registros o solo lo que no estan duplicados. En mi caso, he usado solo union, supongo que internamente une las dos tablas, y como el select hace la suma, pues se muestra la suma.



volviendo a lo del principio, si union solo muestra los no duplicados, xq cuando hago

consulta1

union

consulta2

los registros de consulta 1 machacan a los de cosulta 2? aquellos donde colum 1---colum2-----colum3 son iguales, pero column4 es distinto ( decir que agrupo por kas 3 primeras columnas, no se si eso tiene algo que ver) y xq se sobrescribe los registros de la prmera consulta en la segunda y no alrreves?
  #7 (permalink)  
Antiguo 23/04/2014, 07:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: ¿Como funciona realmente UNION?

Cita:
los registros de consulta 1 machacan a los de cosulta 2? aquellos donde colum 1---colum2-----colum3 son iguales, pero column4 es distinto ( decir que agrupo por kas 3 primeras columnas, no se si eso tiene algo que ver) y xq se sobrescribe los registros de la prmera consulta en la segunda y no alrreves?
¿Entendiste que eso no lo hace el UNION?
Ya te lo expliqué:
Cita:
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:
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:
Cita:
lo que quiero es unir las dos subconsultas y sumar el importe, para que quede de esta forma

cod_cliente-----servicio-----subservicio-----importe
1---------------------S12-----------SUB23---------32
1---------------------S12-----------SUB45---------45
1---------------------S34-----------SUB78---------78
2---------------------S12-----------SUB24---------48
2---------------------S33-----------SUB43---------86
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...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 23/04/2014, 08:04
 
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
  #9 (permalink)  
Antiguo 23/04/2014, 08:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: ¿Como funciona realmente UNION?

Cita:
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.
No exactamente... No estás agrupando al final del UNION, sino después UNION. El GROUP BY aplica sobre la tabla derivada, y no sobre cada una de las del UNION.

Cita:
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??
Manual de referencia, manual de referencia, manual de referencia...

UNION devolverá todos los distintos, todos los que encuentre. ¿Por qué va descartar lo que no le dices que descarte?
Es irrelevante que pongas uno u otro orden, porque le estás diciendo que devuelva TODO lo que sea diferente tomando un registro entero como unidad de comparación.
Entendamos esto:
Cita:
1-----------------cliente1-------------test1
2-----------------cliente2-------------test2
3-----------------cliente3-------------test3

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

1-------------------cliente1-----------test33
2-------------------cliente3-----------test32
para el UNION son cinco registros distintos.
Cita:
cod_cliente-----servicio-----subservicio-----importe
1---------------------S12-----------SUB23---------25
1---------------------S12-----------SUB45---------45
1---------------------S34-----------SUB78---------78
2---------------------S12-----------SUB24---------48
2---------------------S33-----------SUB43---------78

cod_cliente-----servicio-----subservicio-----importe
1---------------------S12-----------SUB23---------7
2---------------------S33-----------SUB43---------8
Son siete registros distintos.

UNION no se pone a descartar registros porque se semeje una parte de los valores. Sólo si todos los valores en cada campo del mismo registro se diferencian, y en ninguno de los ejemplos que mencionas se cumple.

Tengo la impresión de que tu problema requiere para su solución una consulta completamente diferente.

Cita:
Y una ultima cosilla, al unir dos subconsultas, puedo elegir que columna de cada registro mostrar??
No exactamente, como dije. Mosrará todo. Si quieres wxcluir algo, debes ponerle las condiciones para que lo excluya.
Cita:
Hay alguna forma de al hacer el group by indicar que ''grupo'' dejar en la agrupacion?
No es tarea del GROUP BY hacer exclusiones de registros. Para eso están otras cláusulas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 23/04/2014 a las 08:40
  #10 (permalink)  
Antiguo 23/04/2014, 09:17
 
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
No exactamente... No estás agrupando al final del UNION, sino después UNION. El GROUP BY aplica sobre la tabla derivada, y no sobre cada una de las del UNION.



Manual de referencia, manual de referencia, manual de referencia...

UNION devolverá todos los distintos, todos los que encuentre. ¿Por qué va descartar lo que no le dices que descarte?
Es irrelevante que pongas uno u otro orden, porque le estás diciendo que devuelva TODO lo que sea diferente tomando un registro entero como unidad de comparación.
Entendamos esto:

para el UNION son cinco registros distintos.

Son siete registros distintos.

UNION no se pone a descartar registros porque se semeje una parte de los valores. Sólo si todos los valores en cada campo del mismo registro se diferencian, y en ninguno de los ejemplos que mencionas se cumple.

Tengo la impresión de que tu problema requiere para su solución una consulta completamente diferente.


No exactamente, como dije. Mosrará todo. Si quieres wxcluir algo, debes ponerle las condiciones para que lo excluya.

No es tarea del GROUP BY hacer exclusiones de registros. Para eso están otras cláusulas.
Como le indico a union que registros descartar?


No es tarea del GROUP BY hacer exclusiones de registros. Para eso están otras cláusulas


Que cláusula puedo usar??

Gracias de nuevo
  #11 (permalink)  
Antiguo 23/04/2014, 09:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: ¿Como funciona realmente UNION?


WHERE, HAVING, subconsultas o JOINs que generen una mejor selección... No hay una solución única, depende del caso.
Sin trabajar con las tablas reales y los datos reales no te puedo dar muchas mas sugerencias. Tienes que tener cierta práctica con SQL para verlo a simple vista.

Es todo estudiar y practicar SQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 23/04/2014, 09:32
 
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

WHERE, HAVING, subconsultas o JOINs que generen una mejor selección... No hay una solución única, depende del caso.
Sin trabajar con las tablas reales y los datos reales no te puedo dar muchas mas sugerencias. Tienes que tener cierta práctica con SQL para verlo a simple vista.

Es todo estudiar y practicar SQL.
Seguiré practicando.

muchas gracias por todo!!!

Etiquetas: realmente, registro, select, tabla
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 09:13.