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

Consulta de resumen de dos tablas

Estas en el tema de Consulta de resumen de dos tablas en el foro de Mysql en Foros del Web. Hola, he intentado hacer esto de varias formas y a la conclusión que he llegado es que no tengo la más mínima idea de como ...
  #1 (permalink)  
Antiguo 10/12/2011, 07:43
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Pregunta Consulta de resumen de dos tablas

Hola, he intentado hacer esto de varias formas y a la conclusión que he llegado es que no tengo la más mínima idea de como se hace

Tengo estas tres tablas

ArtCompras

Fecha
IdArt
Cantidad (cantidades compradas en este registro)

ArtVenta

Fecha
IdArt
Cantidad (cantidades vendidas en este registro)

Articulo
IdArt
Modelo
----------------------------------------
Me gustaria obtener una consulta de resumen con
modelo | total compradas | total vendidas | Stock Actual
------------------------------------------
Lo primero que intente fue:

Código SQL:
Ver original
  1. SELECT  Articulos.IdArt, Articulos.Modelo, SUM(ArtCompras.Cantidad) AS Compradas,  SUM(ArtVenta.Cantidad) AS Vendidas, Compradas - Vendidas  AS Stock
  2. FROM Articulos, ArtCompras, ArtVenta
  3. WHERE Articulos.IdArt IN (SELECT DISTINCT ArtCompras.IdArt FROM ArtCompras)
  4. AND Articulos.IdArt=ArtCompras.IdArt
  5. AND Articulos.IdArt=ArtVenta.IdArt
  6. AND ArtCompras.IdArt=ArtVenta.IdArt
  7. GROUP BY  Articulos.IdArt, Articulos.Modelo
  8. ORDER BY Articulos.Modelo;

El problema que tengo es que la cantidad de registros por artículo en una y otra tabla son diferente y la suma que me da para cada artículos es Cantidad por la cantidad de registros de la tabla que tiene más registros de ese artículo.
Osea que vendidas o compradas que tiene mayor cantidad de registros en la tabla da bien pero la que tiene menor cantidad de registros en la tabla falsea los datos

Bueno muchas gracias por su tiempo
  #2 (permalink)  
Antiguo 12/12/2011, 04:27
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Pregunta Respuesta: Consulta de resumen de dos tablas

Hola.... Supongo que no se puede hacer con sql lo que quiero?

Es mejor hacer las dos consultas por separado y resolverlo desde PHP?
  #3 (permalink)  
Antiguo 12/12/2011, 05:11
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consulta de resumen de dos tablas

Código MySQL:
Ver original
  1.     A.IdArt,
  2.     A.Modelo,
  3.     SUM(AC.Cantidad) Compradas,  
  4.     SUM(AV.Cantidad) Vendidas,
  5.     (SUM(AC.Cantidad) - SUM(AV.Cantidad)) Stock
  6.     Articulos A
  7.     LEFT JOIN ArtCompras AC ON A.IdArt = AC.IdArt
  8.     LEFT JOIN ArtVenta AV ON A.IdArt = AV.IdArt
  9. WHERE Articulos.IdArt IN (SELECT DISTINCT ArtCompras.IdArt FROM ArtCompras)
  10. GROUP BY  A.IdArt
  11. ORDER BY A.Modelo;
Los errores:
1) No se puede usar el alias de una columna del SELECT dentro del mismo SELECT. Tampoco se puede usar dentro del WHERE.
2) JOINs implicitos no sirven para hacer consultas con funciones de agregación con más de dos tablas.
3) El FROM estaba mal definido, y las relaciones del WHERE también. No estaban buscando os datos efectivamente indicados, ya que hacían depender (por ejemplo) las ventas de las compras, cosa que podía no ser verdadera (que compres stock de un artículo no implica que hayas vendido ese artículo en todo el período).
4) Agrupar por más de una columna es innecesario, si ambas columnas implican al mismo registro. Si cada modelo tiene un sólo ID y cada ID corresponde a un solo modelo, agrupar por ambos solo recarga el proceso pero no agrega nada.
__________________
¿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 12/12/2011, 15:26
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Consulta de resumen de dos tablas

Hola, Gracias por tu respuesta... te vas a reir pero no sabía ni que existia inner join, left y right

estoy probando sobre access y en el punto 4 yo pensaba lo mismo, pero no solo en este caso me ha pasado que si no agrupo por todos los campos que quiero mostrar no me toma la consulta, seguramente sea algún otro error de mi inexperiencia.

estoy leyendo algunos manuales al respecto pero no veo donde está el error que no me deja pasar la consulta..

Código MySQL:
Ver original
  1.     A.IdArt,
  2.     A.Modelo,
  3.     SUM(AC.Cantidad)  as Compradas,  
  4.     SUM(AV.Cantidad)  as Vendidas,
  5.     (SUM(AC.Cantidad) - SUM(AV.Cantidad)) as Stock
  6.     Articulos A
  7.     LEFT JOIN ArtCompras AC ON A.IdArt = AC.IdArt
  8.     LEFT JOIN ArtVenta AV ON A.IdArt = AV.IdArt
  9. WHERE Articulos.IdArt IN (SELECT DISTINCT ArtCompras.IdArt FROM ArtCompras)
  10. GROUP BY  A.IdArt
  11. ORDER BY A.Modelo;

el mensaje de error es:

Error de sintaxis (falta operador) en la expresión de consulta'A.IdArt = AC.IdArt
LEFT JOIN ArtVenta AV ON A.IdArt = AV.IdAr'.

Puede ser un problema del vendito access?
  #5 (permalink)  
Antiguo 12/12/2011, 17:07
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consulta de resumen de dos tablas

Cita:
estoy probando sobre access y en el punto 4 yo pensaba lo mismo, pero no solo en este caso me ha pasado que si no agrupo por todos los campos que quiero mostrar no me toma la consulta, seguramente sea algún otro error de mi inexperiencia.
Si estás usando Access, ¿por qué estás posteando en el Foro de MySQL?
Si no estás usando Access, sino MySQL, no pruebes las consultas en Access, porque no son compatibles.

Access y MySQL ni siquiera se parecen. Access tiene recursos de SQL muy limitados y no sirve ni como referencia, porque no es capaz de manejar las consultas de SQL mas o menos elaboradas, y tiene restricciones incluso para usar ANSI-SQL, que sería la forma estandar del SQL que todo DBMS es capaz de interpretar. Pero como Access no es un DBMS, no puede.

No mezcles Access con verdaderas bases de datos.
__________________
¿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 12/12/2011, 20:31
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Consulta de resumen de dos tablas

Estoy totalmente de acuerdo contigo... Tengo un servidor donde uso MySql.. este es mi
sitio:
Pero estaba probando esto en access.

Gracias por tu ayuda, realmente fue de muy buena calidad.
  #7 (permalink)  
Antiguo 13/12/2011, 05:42
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Consulta de resumen de dos tablas

Ya estoy instalando wamp en win7 para hacer las pruebas... espero que funcione
  #8 (permalink)  
Antiguo 13/12/2011, 05:44
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consulta de resumen de dos tablas

Muy buena idea .
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 14/12/2011, 08:56
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Consulta de resumen de dos tablas

Hola, no fue nada dificil migrar a mysql la base de datos. Hace mucho que estaba por hacer esto y no me animaba. Ahora queda conectar con vb a ella, pero no creo que vaya a tener problemas con eso.

ejecute la consulta sobre mysql:

Código SQL:
Ver original
  1. SELECT  
  2.     A.IdArt,
  3.     A.Modelo,
  4.     SUM(AC.Cantidad) Compradas,  
  5.     SUM(AV.Cantidad) Vendidas,
  6.     (SUM(AC.Cantidad) - SUM(AV.Cantidad)) Stock
  7. FROM
  8.     Articulos A
  9.     LEFT JOIN ArtCompras AC ON A.IdArt = AC.IdArt
  10.     LEFT JOIN ArtVenta AV ON A.IdArt = AV.IdArt
  11. WHERE Articulos.IdArt IN (SELECT DISTINCT ArtCompras.IdArt FROM ArtCompras)
  12. GROUP BY  A.IdArt
  13. ORDER BY A.Modelo;

#1054 - Unknown column 'Articulos.IdArt' in 'IN/ALL/ANY subquery'

Realmente e intentado leer algún tutorial sobre composiciones, pero no logro entenderlo del todo. Tal vez tengas algún link a algún manual que este bueno!!

Gracias denuevo.
  #10 (permalink)  
Antiguo 14/12/2011, 09:03
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consulta de resumen de dos tablas

Faltaba cambiar un nombre de tabla por su alias:
Código MySQL:
Ver original
  1.     A.IdArt,
  2.     A.Modelo,
  3.     SUM(AC.Cantidad) Compradas,
  4.     SUM(AV.Cantidad) Vendidas,
  5.     (SUM(AC.Cantidad) - SUM(AV.Cantidad)) Stock
  6.     Articulos A
  7.     LEFT JOIN ArtCompras AC ON A.IdArt = AC.IdArt
  8.     LEFT JOIN ArtVenta AV ON A.IdArt = AV.IdArt
  9. WHERE A.IdArt IN (SELECT DISTINCT ArtCompras.IdArt FROM ArtCompras)
  10. GROUP BY A.IdArt
  11. ORDER BY A.Modelo;
De todos modos ese WHERE no estoy seguro de que eralmente se necesite:
Código MySQL:
Ver original
  1.     A.IdArt,
  2.     A.Modelo,
  3.     SUM(AC.Cantidad) Compradas,
  4.     SUM(AV.Cantidad) Vendidas,
  5.     (SUM(AC.Cantidad) - SUM(AV.Cantidad)) Stock
  6.     Articulos A
  7.     LEFT JOIN ArtCompras AC ON A.IdArt = AC.IdArt
  8.     LEFT JOIN ArtVenta AV ON A.IdArt = AV.IdArt
  9. GROUP BY A.IdArt
  10. ORDER BY A.Modelo;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 14/12/2011, 09:28
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Consulta de resumen de dos tablas

Hola, Gracias funcionó!!

La cláusula where, la uso para que no me muestre artículos que están ingresados en la Base de Datos. Pero de los cuales nunca compre ni uno. Están ingresados, porque cuando la gente me pide los voy registrando para ver si es necesario comprarlos en el futuro.

Cuando no hay registros de ventas muestra NULL y por tanto no puede sumar el stock... claro que solo tengo que mirar a la primera columna para ver cuantos compré. Pero hay forma de que muestre 0 cuando es NULL?

Gracias, más que satisfecho con tu respuesta y con lo que he aprendido por seguir tus consejos.
  #12 (permalink)  
Antiguo 14/12/2011, 09:42
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Consulta de resumen de dos tablas

Sabés que estoy revisando y me da el mismo error que cuando pregunté la primera vez. Te explico por ejemplo:

Deal articulo 1 hay un registro en la tabla compras de cantidad 5

en la tabla ventas hay 2 registros de venta de este artículo cada uno con cantidad 1 osea dos vendidas una por registro

el resultado de la consulta muestra:

compradas 10 vendidas 2 stock 8

debería mostrar

compradas 5 vendidas 2 stock 3

si la cantidad de registros de compradas y vendidas es igual para el artículo no hay problema muestra bien los datos, pero si hay más registros de vendidas que de compradas muestra mal los datos
  #13 (permalink)  
Antiguo 14/12/2011, 09:44
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consulta de resumen de dos tablas

Cita:
Cuando no hay registros de ventas muestra NULL y por tanto no puede sumar el stock... claro que solo tengo que mirar a la primera columna para ver cuantos compré. Pero hay forma de que muestre 0 cuando es NULL?
Para esos casos usas IFNULL:
Código MySQL:
Ver original
  1. * * A.IdArt,
  2. * * A.Modelo,
  3. * * IFNULL(SUM(AC.Cantidad), 0) Compradas,
  4. * * IFNULL(SUM(AV.Cantidad), 0) Vendidas,
  5. * * (IFNULL(SUM(AC.Cantidad),0) - IFNULL(SUM(AV.Cantidad),0)) Stock
  6. * * Articulos A
  7. * * LEFT JOIN ArtCompras AC ON A.IdArt = AC.IdArt
  8. * * LEFT JOIN ArtVenta AV ON A.IdArt = AV.IdArt
  9. GROUP BY A.IdArt
  10. ORDER BY A.Modelo;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 14/12/2011, 09:49
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Consulta de resumen de dos tablas

Se ve que estábamos publicando a la vez.

Tampoco sabía de la existencia del ifnull..... gracias

No se si leiste el mensaje que publicamos a la vez?
  #15 (permalink)  
Antiguo 14/12/2011, 10:26
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Consulta de resumen de dos tablas

Le hice las correcciones que tu me dijiste en el primer mensaje a la consulta que había hecho, y me da los mismos errores que está última:

Código MySQL:
Ver original
  1. SELECT  Articulos.IdArt, Articulos.Modelo, sum(ArtCompras.Cantidad) AS Compradas,  sum(ArtVenta.Cantidad) AS Vendidas, sum(ArtCompras.Cantidad) - sum(ArtVenta.Cantidad)  AS Stock
  2. FROM Articulos, ArtCompras, ArtVenta
  3. WHERE Articulos.IdArt IN (SELECT DISTINCT ArtCompras.IdArt FROM ArtCompras)
  4. AND Articulos.IdArt=ArtCompras.IdArt
  5. AND Articulos.IdArt=ArtVenta.IdArt
  6. GROUP BY  Articulos.IdArt
  7. ORDER BY Articulos.Modelo;
  #16 (permalink)  
Antiguo 14/12/2011, 11:15
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consulta de resumen de dos tablas

Esa última no sirve para lo que quieres. Sólo una consulta usando LEFT JOIN puede acercarte al resultado deseado.
Esta tarde pruebo con datos tu problema. Ahora estoy en el trabajo y no tengo acceso a MyQSL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #17 (permalink)  
Antiguo 15/12/2011, 04:03
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Consulta de resumen de dos tablas

ok, muchas gracias por tu tiempo gnzsoloyo..... si quieres te paso un .sql con las tablas
  #18 (permalink)  
Antiguo 15/12/2011, 04:12
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consulta de resumen de dos tablas

Cita:
Iniciado por francap Ver Mensaje
ok, muchas gracias por tu tiempo gnzsoloyo..... si quieres te paso un .sql con las tablas
Eso sería una muy buena idea. De esa forma puedo probar con tu propio esquema.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #19 (permalink)  
Antiguo 15/12/2011, 08:08
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Consulta de resumen de dos tablas

Ya hice un .sql Decime por privado como te lo envío

Saludos
  #20 (permalink)  
Antiguo 16/12/2011, 03:34
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consulta de resumen de dos tablas

Lamentablemente la consulta es un poco compleja, porque para evitar la multiplicación de datos ambas cuentas (Compras y Ventas) deben estar consolidadas ya por separado, lo que significa que hay que hacer primero las subconsultas en el FROM y entonces hacer el INNER JOIN correspondiente.
La respuesta es en definitiva:
Código MySQL:
Ver original
  1.   T1.IdArt, T1.Modelo, Compras, IFNULL(Ventas, 0) Ventas, (Compras - IFNULL(Ventas, 0) ) Saldo
  2.   (SELECT
  3.     A.IdArt,
  4.     A.Modelo,
  5.     SUM(AC.Cantidad) Compras
  6.   FROM
  7.     Articulos A
  8.     INNER JOIN ArtCompras AC ON AC.IdArt = A.IdArt
  9.   GROUP BY Ac.IdArt) T1
  10.   (SELECT
  11.     A.IdArt,
  12.     SUM(AV.Cantidad) Ventas
  13.   FROM
  14.     Articulos A
  15.     INNER JOIN ArtVenta AV ON A.IdArt = AV.IdArt
  16.   GROUP BY A.IdArt) T2 ON T1.IdArt = T2.IdArt;

Respecto a las tablas, hay algunos cuantos defectos formales, pero los más importantes son:
- Usas campos DATETIME para Fecha y para Hora, cuando deberías usar DATE y TIME para cada uno. De ese modo evitas basura en los datos que puede, luego, generar errores no detectables.
- Estas usando FK sin declararlas, a pesar de que las tablas si son InnoDB.
- Hay campos que no usas. Si no los usas o no deben existir, o debes implementarlos en la programación.
- Hay identificadores adicionales en las tablas de compra y venta que no se entiened para qué se usan.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #21 (permalink)  
Antiguo 16/12/2011, 06:10
 
Fecha de Ingreso: agosto-2010
Ubicación: Montevideo
Mensajes: 107
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Consulta de resumen de dos tablas

Hola, es excelente el trabajo que haces en el foro!!

Todo funcionó correctamente, ahora solo me queda sentarme con algún manual y entenderlo. Gracias!!

Respecto de las correcciones, lo de usar un campo date y otro time no se me había ocurrido. La base estaba originalmente hecha en access, ya no me acuerdo si tiene la opción pero supongo que si. Voy a implementarlo de aquí en mas que ya me liberé de "Bill".
Las Fk estan delcaradas en access, no se porque no las exporto mysql migrator.

Los campos en realidad los uso todos, yo te envié las tablas que estaban directamente relacionadas con las consutlas.

Cada registro de la tabla artventas es un renglón digamos de la factura.... osea hay una factura que tiene x artventas y lo mismo pasa con artcompras.

y también hay una tabla exactamente igual a artvetnas y artcompras donde guardo los historiales de de modificaciones con el identificador del usuario que lo hizo fecha y hora (en elmismo registro datatime.. por ahora).

Bueno nada realmente queda chico cualquier cosa que pueda decir de la ayuda que me has dado y el tiempo que has perdido en ayudarme.

Gracias de nuevo, y estoy a las órdenes si en algún momento puedo ayudarte en algo.

Saludos
  #22 (permalink)  
Antiguo 16/12/2011, 06:25
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Consulta de resumen de dos tablas

Me alegro que te haya servido.

Como nota, te diría que habría que considerar hacerle una buena ingeniería reversa con MySQL Workbench a la base para revisarla y verificar si hay cosas que se pueden mejorar en el diseño.
Puede que la migración le haya sacado cosas o que se las agregara.
Piénsalo.


Saludos y suerte.

__________________
¿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; 16/12/2011 a las 07:24

Etiquetas: registros, select, tabla, 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 12:07.