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

Problema/Duda con UNION

Estas en el tema de Problema/Duda con UNION en el foro de Mysql en Foros del Web. Hola a todos, tengo las siguiente tablas -> 2011_tickets, 2012_tickets con campos como id_articulo, fecha, total_euros, total_partidas... es más extenso pero con esto me basta ...
  #1 (permalink)  
Antiguo 02/05/2012, 03:18
 
Fecha de Ingreso: septiembre-2010
Ubicación: /home/
Mensajes: 103
Antigüedad: 13 años, 7 meses
Puntos: 17
Problema/Duda con UNION

Hola a todos,

tengo las siguiente tablas -> 2011_tickets, 2012_tickets

con campos como id_articulo, fecha, total_euros, total_partidas... es más extenso pero con esto me basta para el ejemplo

luego si quiero sacar el total_euros de una consulta entres dos fechas, como seria?

Código:
Select distinct(id_articulo),sum(total_euros),sum(total_partidas) FROM 2011_tickets WHERE fecha>=fecha_desde AND fecha<=fecha_hasta 
UNION
Select distinct(id_articulo),sum(total_euros),sum(total_partidas) FROM 2012_tickets WHERE fecha>=fecha_desde AND fecha<=fecha_hasta GROUP BY id_articulo
la consulta más o menos sería esta, pero me devuelve datos que no acaban de ser del todo ciertos, me sale un articulo particularmente totalmente desorbitado... en que me estoy equivocando? es posible sacar total de dos tablas distintas con union?

saludos

Última edición por Bugger; 02/05/2012 a las 03:55
  #2 (permalink)  
Antiguo 02/05/2012, 03:56
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema/Duda con UNION

Código MySQL:
Ver original
  1. Select sbc.id_articulo, sum(sbc.total_euros)
  2. FROM (Select id_articulo, total_euros
  3. FROM 2011_tickets
  4. WHERE fecha>=fecha_desde AND fecha<=fecha_hasta
  5. Select id_articulo,total_euros
  6. FROM 2012_tickets
  7. WHERE fecha>=fecha_desde AND fecha<=fecha_hasta) as sbc
  8. GROUP BY sbc.id_articulo;

Código MySQL:
Ver original
  1. Select sbc.id_articulo, sum(sbc.total_euros)
  2. FROM (Select id_articulo, fecha, total_euros
  3. FROM 2011_tickets
  4. Select id_articulo,fecha,total_euros
  5. FROM 2012_tickets ) as sbc
  6. WHERE sbc.fecha>=fecha_desde AND sbc.fecha<=fecha_hasta
  7. GROUP BY sbc.id_articulo;
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 02/05/2012, 04:51
 
Fecha de Ingreso: septiembre-2010
Ubicación: /home/
Mensajes: 103
Antigüedad: 13 años, 7 meses
Puntos: 17
Respuesta: Problema/Duda con UNION

Hola quimfv,

antes de nada, gracias por la respuesta.

en consulta básica me funciona bien, pero cuando meto todos los datos me pierdo.

pongo la consulta entera y a ver si me puedes echar un cable:

Código MySQL:
Ver original
  1. SELECT sbc.id_article, sum(sbc.total_euros) ,sum(sbc.total_partides), sum(sbc.total_pes),
  2. sum(sbc.total_cost_partides), sum(sbc.total_cost_pes), sbc.iva                        
  3. (SELECT id_article, sum(".$anyf."_lin_tickets.total) as total_euros,
  4. sum(".$anyf."_lin_tickets.partides) as total_partides,
  5. sum(".$anyf."_lin_tickets.pes) as total_pes,
  6. ".$anyf."_lin_tickets.cost * (sum(".$anyf."_lin_tickets.partides)) as total_cost_partides,
  7. ".$anyf."_lin_tickets.cost * (sum(".$anyf."_lin_tickets.pes) / 1000) as total_cost_pes,
  8. iva                          
  9. FROM ".$anyf."_lin_tickets,".$anyf."_tickets  
  10. WHERE ".$anyf."_lin_tickets.id_ticket = ".$anyf."_tickets.id_ticket
  11. AND ".$anyf."_tickets.id_tenda = ".$id_tenda."
  12. AND ".$anyf."_tickets.data >= ".$datad."
  13. AND ".$anyf."_tickets.anulat = 0 AND ".$anyf."_tickets.total > 0
  14. ".$wlin_tickets."
  15. SELECT id_article,sum(".$anyd."_lin_tickets.total) as total_euros,
  16. sum(".$anyd."_lin_tickets.partides) as total_partides,
  17. sum(".$anyd."_lin_tickets.pes) as total_pes,
  18. ".$anyd."_lin_tickets.cost * (sum(".$anyd."_lin_tickets.partides)) as total_cost_partides,
  19. ".$anyd."_lin_tickets.cost * (sum(".$anyd."_lin_tickets.pes) / 1000) as total_cost_pes,
  20. iva                          
  21. FROM ".$anyd."_lin_tickets,".$anyd."_tickets
  22. WHERE ".$anyd."_lin_tickets.id_ticket = ".$anyd."_tickets.id_ticket
  23. AND ".$anyd."_tickets.id_tenda = ".$id_tenda."
  24. AND ".$anyd."_tickets.data <= ".$dataf."
  25. AND ".$anyd."_tickets.anulat = 0 AND ".$anyd."_tickets.total > 0
  26. ".$wlin_tickets."
  27. )
  28. as sbc
  29. GROUP BY sbc.id_article

donde anyd es el año de la fecha desde, y el anyf es el año de la fecha Hasta

Última edición por Bugger; 02/05/2012 a las 05:00 Razón: me equivoqué cargando la consulta, ahora está correcta
  #4 (permalink)  
Antiguo 02/05/2012, 05:23
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema/Duda con UNION

Código MySQL:
Ver original
  1. SELECT sbc.id_article,
  2. sum(sbc.total_euros),
  3. sum(sbc.total_partides),
  4. sum(sbc.total_pes),
  5. sum(sbc.total_cost_partides),
  6. sum(sbc.total_cost_pes),
  7. sum(sbc.iva)
  8. (SELECT id_article, ".$anyf."_lin_tickets.total as total_euros,
  9. ".$anyf."_lin_tickets.partides as total_partides,
  10. ".$anyf."_lin_tickets.pes as total_pes,
  11. ".$anyf."_lin_tickets.cost * (".$anyf."_lin_tickets.partides) as total_cost_partides,
  12. ".$anyf."_lin_tickets.cost * (".$anyf."_lin_tickets.pes / 1000) as total_cost_pes,
  13. iva                          
  14. FROM ".$anyf."_lin_tickets INNER JOIN ".$anyf."_tickets  
  15. ON ".$anyf."_lin_tickets.id_ticket = ".$anyf."_tickets.id_ticket
  16. WHERE ".$anyf."_tickets.id_tenda = ".$id_tenda."
  17. AND ".$anyf."_tickets.data >= ".$datad."
  18. AND ".$anyf."_tickets.anulat = 0 AND ".$anyf."_tickets.total > 0
  19. SELECT id_article,".$anyd."_lin_tickets.total as total_euros,
  20. ".$anyd."_lin_tickets.partides as total_partides,
  21. ".$anyd."_lin_tickets.pes as total_pes,
  22. ".$anyd."_lin_tickets.cost * (".$anyd."_lin_tickets.partides) as total_cost_partides,
  23. ".$anyd."_lin_tickets.cost * (".$anyd."_lin_tickets.pes / 1000) as total_cost_pes,
  24. iva                          
  25. FROM ".$anyd."_lin_tickets INNER JOIN ".$anyd."_tickets
  26. ON ".$anyd."_lin_tickets.id_ticket = ".$anyd."_tickets.id_ticket
  27. WHERE ".$anyd."_tickets.id_tenda = ".$id_tenda."
  28. AND ".$anyd."_tickets.data <= ".$dataf."
  29. AND ".$anyd."_tickets.anulat = 0 AND ".$anyd."_tickets.total > 0
  30. )
  31. as sbc
  32. GROUP BY sbc.id_article

no se què és ".$wlin_tickets." linia 15 i 28.

No se donde tienes el iva, ni si es un valor.... o el tipo....

Los calculos de coste no se si estaran bien...

La idea es que la subquery (sbc) selecciona los registros a tener en cuenta y la "super"query los agrega (SUM)


Código pre:
Ver original
  1. Superquery SUMA
  2. Sbc Seleciona
  3.       Sbc1 selecciona anyo 1
  4.           UNION ALL
  5.       Sbc2 selecciona anyo 2
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 02/05/2012, 05:32
 
Fecha de Ingreso: septiembre-2010
Ubicación: /home/
Mensajes: 103
Antigüedad: 13 años, 7 meses
Puntos: 17
Respuesta: Problema/Duda con UNION

el Iva es de la linea de tickets, es el iva que tiene asignado ese articulo (4,8 o 18)
el $wlin_tickets es un parámetro que le paso para distinguir un campo, como podría ser vendedor, para saber que artículos vende X vendedor o cosas por el estilo.

igualmente, me sigue lanzando datos erróneos la query, y no veo el motivo, se te ocurre que puede estar pasando? me salen partidas de más entre otras cosas.

por cierto, gracias por las correcciones de inner join y demás que no me había fijado!

Saludos
  #6 (permalink)  
Antiguo 02/05/2012, 06:23
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema/Duda con UNION

Si el iva es el tipo (4,8, 18 o lo que ponga el PP) no puedes sumarlo debes obtener antes el valor para poder sumarlo....(base * (tipo/100))

No hay ninguna restricción por partida con lo que si salen es que cumplen con las otras restricciones.... luego el error no es de sintaxis ...

en cuanto a $wlin_tickets si esta bien formulada (" AND nombrecampo=valor") la puedes usar...

Estas seguro que las fechas limite siempre estan una en el primer año y la otra en el segundo.... si las dos estuvieran en un año como has puesto la restricción no funcionaria esta claro no?

En funcion de las fechas limite tambien pdrias usar consultas mas simples si son las dos de un año luego no es necesaria la UNION.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 02/05/2012 a las 06:34
  #7 (permalink)  
Antiguo 02/05/2012, 07:44
 
Fecha de Ingreso: septiembre-2010
Ubicación: /home/
Mensajes: 103
Antigüedad: 13 años, 7 meses
Puntos: 17
Respuesta: Problema/Duda con UNION

Hola de nuevo,
este problema es solo de la consulta en caso de que solo sean fechas de diferente año, si las fechas son del mismo año no tengo hecho el UNION y solo ataca sobre una tabla y la consulta, seria parecida a la mitad de la que me estás ayudando hacer pero con un rango de fechas.

el resultado de esto seria:

Articulo - Partidas o Peso - Euros - Margen limpio - por eso necesito el IVA de cada linea de registro para poder calcular el total sobre ese IVa, en cuanto al Coste, según el día cambia (como puede pasar con el IVA el año que viene), lo que como tu has dicho, no ser si será correcto, aunque el resultado de esa 'super' query ya no me hacen bien ni la suma de partidas ni la suma de euros... así que lo demás es secundario!
  #8 (permalink)  
Antiguo 02/05/2012, 08:42
 
Fecha de Ingreso: septiembre-2010
Ubicación: /home/
Mensajes: 103
Antigüedad: 13 años, 7 meses
Puntos: 17
Respuesta: Problema/Duda con UNION

Hola de nuevo... si con la solución y era culpa mía por el jaleo de fechas y los años, tenia las clausulas al revés.


Código MySQL:
Ver original
  1. SELECT sbc.id_article as id_article,
  2. sum(sbc.total_article) as total_article,
  3. sum(sbc.total_partides) as total_partides,
  4. sum(sbc.total_pes) as total_pes,
  5. sum(sbc.total_cost_partides) as total_cost_partides,
  6. sum(sbc.total_cost_pes) as total_cost_pes,
  7. iva
  8. (
  9. SELECT id_article,
  10. ".$anyf."_lin_tickets.total as total_article,
  11. ".$anyf."_lin_tickets.partides as total_partides,
  12. ".$anyf."_lin_tickets.pes as total_pes,
  13. ".$anyf."_lin_tickets.cost * ".$anyf."_lin_tickets.partides as total_cost_partides,
  14. ".$anyf."_lin_tickets.cost * (".$anyf."_lin_tickets.pes / 1000) as total_cost_pes,
  15. iva
  16. FROM ".$anyf."_lin_tickets INNER JOIN ".$anyf."_tickets  
  17. ON ".$anyf."_lin_tickets.id_ticket = ".$anyf."_tickets.id_ticket
  18. WHERE ".$anyf."_lin_tickets.id_tenda = ".$id_tenda."
  19. AND ".$anyf."_tickets.data <= ".$dataf."
  20. AND ".$anyf."_tickets.anulat = 0 AND ".$anyf."_tickets.total > 0
  21. ".$wlin_tickets."
  22. SELECT id_article,".$anyd."_lin_tickets.total as total_article,
  23. ".$anyd."_lin_tickets.partides as total_partides,
  24. ".$anyd."_lin_tickets.pes as total_pes,
  25. ".$anyd."_lin_tickets.cost * ".$anyd."_lin_tickets.partides as total_cost_partides,
  26. ".$anyd."_lin_tickets.cost * (".$anyd."_lin_tickets.pes / 1000) as total_cost_pes,
  27. iva
  28. FROM ".$anyd."_lin_tickets INNER JOIN ".$anyd."_tickets
  29. ON ".$anyd."_lin_tickets.id_ticket = ".$anyd."_tickets.id_ticket
  30. WHERE ".$anyd."_lin_tickets.id_tenda = ".$id_tenda."
  31. AND ".$anyd."_tickets.data >= ".$datad."
  32. AND ".$anyd."_tickets.anulat = 0 AND ".$anyd."_tickets.total > 0
  33. ".$wlin_tickets."
  34. )
  35. as sbc
  36. GROUP BY sbc.id_article

muchas gracias por el seguimiento.

Etiquetas: sql, union
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 11:45.