SQL - suma de compras y ventas

 
Vista:

suma de compras y ventas

Publicado por Victor (1 intervención) el 13/10/2011 10:41:38
Hola, necesito conseguir la suma de las ventas y las compras de un articulo. Están en tablas distintas: articulo, compras, ventas.

Si hago la suma me duplica cantidades:

SELECT a.codigo, sum(c.unidades) AS compras, c.numero, sum(v.unidades) AS ventas, v.numero FROM articulo a left join compras c on c.articulo=a.codigo left join ventas v on v.articulo=a.codigo group by a.codigo

Si no la hago me salen las filas duplicadas:
SELECT a.codigo, c.unidades AS compras, c.numero, v.unidades AS ventas, v.numero FROM articulo a left join compras c on c.articulo=a.codigo left join ventas v on v.articulo=a.codigo

Alguna solución? Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

suma de compras y ventas

Publicado por leonardo_josue (1173 intervenciones) el 13/10/2011 17:17:12
Hola Victor:

El problema es que la agrupación la tienes que realizar antes de hacer las uniones, de tal manera que sean relaciones uno a uno, tal como lo tienes se está realizando una especie de producto carteciano. No mencionas qué manejador de BD estás utilizando, ni tampoco nos pones la estructura de tus tablas por lo que no sé que información deba traer cada campo, pero te pongo un ejemplo con MySQL para ver si queda un poco más claro:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
mysql> CREATE TABLE articulos (idArticulo INT, descripcion VARCHAR (10));
Query OK, 0 rows affected (0.12 sec)
 
mysql> INSERT INTO articulos VALUES (1, 'uno'), (2, 'dos'), (3, 'tres');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM articulos;
+------------+-------------+
| idArticulo | descripcion |
+------------+-------------+
|          1 | uno         |
|          2 | dos         |
|          3 | tres        |
+------------+-------------+
3 rows in set (0.00 sec)
 
mysql> CREATE TABLE compras (idCompra INT, idArticulo INT, unidades INT);
Query OK, 0 rows affected (0.09 sec)
 
mysql> INSERT INTO compras VALUES (1, 1, 10), (2, 1, 20), (3, 2, 5),
    -> (4, 3, 10), (5, 2, 7);
Query OK, 5 rows affected (0.06 sec)
Records: 5  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM compras;
+----------+------------+----------+
| idCompra | idArticulo | unidades |
+----------+------------+----------+
|        1 |          1 |       10 |
|        2 |          1 |       20 |
|        3 |          2 |        5 |
|        4 |          3 |       10 |
|        5 |          2 |        7 |
+----------+------------+----------+
5 rows in set (0.00 sec)
 
mysql> CREATE TABLE ventas (idVenta INT, idArticulo INT, unidades INT);
Query OK, 0 rows affected (0.09 sec)
 
mysql> INSERT INTO ventas VALUES (1, 1, 13), (2, 2, 6), (3, 1, 10);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM ventas;
+---------+------------+----------+
| idVenta | idArticulo | unidades |
+---------+------------+----------+
|       1 |          1 |       13 |
|       2 |          2 |        6 |
|       3 |          1 |       10 |
+---------+------------+----------+
3 rows in set (0.00 sec)
 
mysql> SELECT a.idArticulo, c.compras, v.ventas
    -> FROM articulos a
    -> LEFT JOIN (
    -> SELECT idArticulo, SUM(unidades) compras
    -> FROM compras GROUP BY idArticulo) c ON c.idArticulo=a.idArticulo
    -> LEFT JOIN (
    -> SELECT idArticulo, SUM(unidades) ventas
    -> FROM ventas GROUP BY idArticulo) v ON v.idArticulo=a.idArticulo;
+------------+---------+--------+
| idArticulo | compras | ventas |
+------------+---------+--------+
|          1 |      30 |     23 |
|          2 |      12 |      6 |
|          3 |      10 |   NULL |
+------------+---------+--------+
3 rows in set (0.00 sec)


Observa que en los LEFT JOIN's es donde realizo la sumatoria y la agrupación por articulo, de tal manera que al hacer la unión la relación queda 1 a 1, por lo tanto no hay registros ni datos duplicados. Si continuas con problemas POSTEA LA ESTRUCTURA DE TUS TABLAS, y pon algunos datos de ejemplo, para poder ayudarte con la consulta.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

suma de compras y ventas

Publicado por Diana Carolina Gallo Lara (1 intervención) el 11/02/2012 02:16:27
Amigo mil gracias, estamos haciendo un curso y nos sirvió perfectamente, eres muy amable.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

suma de compras y ventas

Publicado por hector (1 intervención) el 02/01/2013 14:00:53
Gracias leonardo por tu excelente ayuda, pero podrias ayudarme con algo parecido como esto??
no me muestra los resultados como deberia ser.

SELECT a.cod, a.valor FROM tabla1 a
LEFT JOIN (SELECT tabla1.cod, SUM(valor) vr_tabla1 FROM tabla1 GROUP BY cod ) b ON a.cod = b.cod
LEFT JOIN (SELECT tabla2.cod, SUM(valor) vr_tabla2 FROM tabla2 GROUP BY cod ) c ON a.cod = c.cod

queiro que me muewstre el codigo de ambas tablas, los agrupe y los sume

mil gracias...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

suma de compras y ventas

Publicado por Matias Palacios (1 intervención) el 13/02/2013 17:20:48
Excelente aporte el de leonardo_josue... este tipo de consultas anidadas no lo conocía... varias veces tuve que caer en ingresar las consultas anidadas dentro de la lista de campos, cosa que hace mucho mas lenta la consulta. con éste método se mejora significativamente la velocidad de la consulta.
Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

suma de compras y ventas

Publicado por Richard Ramirez (1 intervención) el 18/02/2013 18:48:45
Uffffff que aporte para mi q apenas empiezo con mysql me sirvio de mucha ayuda gracias leonardo_josue
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

suma de compras y ventas

Publicado por raul (1 intervención) el 18/04/2013 06:32:25
Excelente aportaso amigo , muchas gracias por tu ayuda
espero algun dia poder devolverte el favor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar