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

Sumar datos de varias tablas

Estas en el tema de Sumar datos de varias tablas en el foro de Mysql en Foros del Web. Hola, necesito pedirles ayuda a ver si me pueden dar una mano con este asunto: Tengo las siguientes tablas: MARCAS | id | marca | ...
  #1 (permalink)  
Antiguo 18/05/2010, 10:26
Avatar de educlon  
Fecha de Ingreso: octubre-2003
Ubicación: Buenos Aires
Mensajes: 35
Antigüedad: 20 años, 6 meses
Puntos: 0
Sumar datos de varias tablas

Hola, necesito pedirles ayuda a ver si me pueden dar una mano con este asunto:

Tengo las siguientes tablas:

MARCAS
| id | marca |
| 1 | Garmin |
| 2 | Sony |
| 3 | Linksys |

PRODUCTOS
| id | id_marca | modelo | descripcion |
| 1 | 3 | RJ654 | Router |
| 2 | 1 | GJ655 | GPS |
| 3 | 2 | NJ656 | Notebook |

STOCK
| id | id_prod | cantidad |
| 1 | 1 | 10 |
| 2 | 1 | 20 |
| 3 | 1 | 10 |
| 4 | 2 | 30 |
| 5 | 2 | 20 |

ITEMS_VENTA
| id | id_producto | cantidad |
| 1 | 1 | 3 |
| 2 | 1 | 1 |
| 3 | 1 | 4 |
| 4 | 2 | 3 |
| 5 | 2 | 2 |

En la tabla STOCK se van agregando las cantidades de los productos a medida que ingresan al local, y en la tabla ITEMS_VENTA se van agregando los mismos productos que se venden.

Necesito hacer una consulta que me traiga todos los datos de la tabla PRODUCTOS, la marca y la suma de las cantidades que estan en las tablas STOCK e ITAMS_VENTAS, de tal forma que el resultado sea el siguiente:


| id | id_marca | modelo | descripcion | marca | cant_stock | cant_vendida | stock_actual |
| 1 | 7 | ABC123 | ROUTER | LINKSYS | 40 | 8 | 32 |
| 2 | 3 | DEF456 | DISCO | WDIGITAL | 50 | 5 | 45 |

He logrado hacer las sumas, pero una de ellas me da mal:

SELECT productos.*, marcas.marca, IFNULL(SUM(stock.cantidad),0) AS cant_stock, IFNULL(SUM(items_venta.cantidad),0) AS cant_vendida, (cant_stock-cant_vendida) AS stock_actual FROM productos LEFT JOIN stock ON stock.id_prod=productos.id LEFT JOIN items_venta ON items_venta.id_producto=productos.id LEFT JOIN marcas ON productos.id_marca=marcas.id GROUP BY stock.id_prod;

Les agradezco cualquier ayuda que me puedan brindar.

Saludos...
  #2 (permalink)  
Antiguo 18/05/2010, 10:43
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Sumar datos de varias tablas

educlon...
Como consejo, te recomiendo cambies el orden de las funciones IFNULL y SUM.

Cuando utilizas funciones de agrupación, los valores NULL te pueden dar muchos dolores de cabeza para las operaciones matemáticas. Te recomiendo tratarlos antes de realizar operaciones.

quedaría:
SUM(IFNULL(campo,0))

Para hacer pruebas, entenderás que muchos no tenemos tiempo de crear manualmente las tablas ni insertar los registros que muestras. Si posteas los códigos de creación de las tablas y los inserts respectivos, solo basta con copiar y pegar para empezar a hacer pruebas de la salida que requieres e identificar el problema que tienes.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 18/05/2010, 12:41
Avatar de educlon  
Fecha de Ingreso: octubre-2003
Ubicación: Buenos Aires
Mensajes: 35
Antigüedad: 20 años, 6 meses
Puntos: 0
Respuesta: Sumar datos de varias tablas

Gracias por tu respuesta, tenés razón, aquí paso el sql para armar las tablas con datos:

[URL="http://www.ydeas.com.ar/sql.sql"]http://www.ydeas.com.ar/sql.sql[/URL]

Saludos...
  #4 (permalink)  
Antiguo 18/05/2010, 14:07
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Sumar datos de varias tablas

Prueba esta y revisala


Código MySQL:
Ver original
  1. p.id,
  2. p.codigo,
  3. p.modelo,
  4. p.cantidad,
  5. m.marca,
  6. IFNULL(s.cant_stock,0) AS cant_stock,
  7. IFNULL(iv.cant_vendida,0) AS cant_vendida,
  8. (IFNULL(s.cant_stock,0)-IFNULL(iv.cant_vendida,0)) AS stock_actual
  9. FROM productos p
  10. (
  11. p1.id id_prod,
  12. SUM(IFNULL(s1.cantidad,0)) AS cant_stock
  13. FROM productos p1
  14. stock s1
  15. p1.id=s1.id_prod
  16. GROUP BY s1.id_prod
  17. )s
  18. s.id_prod=p.id
  19. (
  20. p2.id id_producto,
  21. SUM(IFNULL(iv2.cantidad,0)) AS cant_vendida
  22. FROM productos p2
  23. items_venta iv2
  24. p2.id=iv2.id_producto
  25. GROUP BY iv2.id_producto
  26. ) iv
  27. iv.id_producto=p.id
  28. LEFT JOIN marcas m
  29. ON p.id_marca=m.id
  30. GROUP BY s.id_prod;

En pocas palabras, como agrupas ambas sumas por el stock.id_prod todos los resultados que concuerden con dicho agrupamiento serán sumados.

Por esta razón, lo que te doy es la suma individual, para luego llamarlo en los joins como procedimientos ya realizados por separado.

Nos cuentas si te sirve.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 18/05/2010 a las 14:14
  #5 (permalink)  
Antiguo 19/05/2010, 12:53
Avatar de educlon  
Fecha de Ingreso: octubre-2003
Ubicación: Buenos Aires
Mensajes: 35
Antigüedad: 20 años, 6 meses
Puntos: 0
Respuesta: Sumar datos de varias tablas

EXCELENTE!!! Mil gracias, funciona a la perfección, incluso le agregué un WHERE, ORDER y LIMIT para paginado y funciona sin problemas. Voy a usar esta consulta como referencia para seguir aprendiendo.

Mil gracias nuevamente HUESOS52 por tu ayuda.

Saludos...

Etiquetas: tablas
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 13:26.