PDA

Ver la Versión Completa : Sum SQL


mjjj
11-11-2008, 23:49:36
Hola, ocurre algo que no se como explicarlo

Ocurre asi:
Tengo 2 tablas, ingresos y egresos, cada uno con los campos ID y cantidad.

Estos son los registros.

Ingresos
ID Cantidad
3 3
3 8

Egresos
ID Cantidad
3 4
3 5

Realizo la siguiente consulta.


select sum(i.cantidad) as ING, sum(e.cantidad) as EGR
from INGRESO I, egreso e
where i.id =e.id


Como resultado me arroja lo siguiente.
ING EGR
22 18

Porque pasara esto, como lo puedo solucionar?

Gracias, Saludos

enecumene
12-11-2008, 00:11:17
Te pregunto, ¿quieres sumar los registros entre las dos tablas?.

Saludos.

Caro
12-11-2008, 00:57:52
Como resultado me arroja lo siguiente.
ING EGR
22 18

Porque pasara esto, como lo puedo solucionar?


Es porque estas haciendo join entre las 2 tablas, el join te da este resultado(es un producto cartesiano).


ID ING ID EGR
3 3 3 4
3 3 3 5
3 8 3 4
3 8 3 5


con el sum de ambas columnas, el resultado que te sale es correcto.

Tienes que hacer el sum por tabla y si quieres tenerlas juntas, puedes utilizar Union.


select sum(i.cantidad) as ING
from INGRESO I
UNION
select sum(e.cantidad) as EGR
from egreso e


Saluditos

Ferrari
12-11-2008, 02:47:31
Caro mas Rapida que un Ferrari me has ganado la respuesta...estoy de acuerdo contigo;)

mjjj
12-11-2008, 13:42:32
No me quedo muy claro, voy hacer mas compleja mi pregunta.

Estoi desarrollando una plicacion de inventario, en donde el costo es un promedio ponderado, de todas las compras que se hicieron de algun producto en particular.

Esto lo enfrente con 3 tablas: Ingresos, Egresos, Inventario


select DISTINCT M.DESCRIPCION, (sum(I.CANTIDAD) - sum(E.CANTIDAD)) AS CANTIDAD,
SUM(I.PRECIO * I.TC * I.CANTIDAD - E.PRECIO * E.TC * E.CANTIDAD)/SUM(I.CANTIDAD - E.CANTIDAD) AS PRECIO
from INGRESO I, EGRESO E, INVENTARIO M
WHERE M.ID = I.ID AND E.ID = I.ID
GROUP BY M.DESCRIPCION


el codigo anterior me funciona bien, solo cuando hay una solo ingreso y/o una solo egreso.

Alguien me puede ayudar un poco con esto... mejorando el codigo SQL, o alguna idea mejor en cuanto a tablas y estructura de base de dato.

La tabla inventario contiene la descripcion del insumo y el codigo: ID y descripcion

Espero me puedan ayudar... gracias

mjjj
12-11-2008, 20:37:44
Voy a tratar de simplificar mi pregunta...

Este codigo SQL me sirve, pero me entrega los datos que necesito como si fueran 2 registros, lo que yo necesito es que me lo entregue en dos columnas distintas.


select sum(i.cantidad) as INGfrom INGRESO IUNIONselect sum(e.cantidad) as EGRfrom egreso e

Espero me puedan ayudar.... gracias

Caro
13-11-2008, 00:41:24
Hola de nuevo mjjj, te pongo un ejemplo considerando las 3 tablas que tienes y mostrando en el Select la descripcion de tu tabla inventario y el sum de ambas tablas (ingresos, egresos).


SELECT M.descripcion,
(SELECT sum(cantidad) FROM ingreso I WHERE I.id=M.id) AS ingr,
(SELECT sum(cantidad) FROM egresos E WHERE E.id=M.id) AS egre
FROM inventario M


Saluditos

mjjj
13-11-2008, 01:10:06
Muchas gracias Caro, pero ocurrio otro hecho.
Utilice este codigo


SELECT M.descripcion,
(SELECT sum(cantidad) FROM ingreso I WHERE I.id=M.id)- (SELECT sum(cantidad) FROM egreso E WHERE E.id=M.id) AS SALDO,

FROM inventario M


El problema es que es una aplicacion para gestionar inventario, y como puede llegar a ocurrir, puede que solo hayan ingresos y ningun egreso.

Dado esto (que exista ingreso y no egreso), me aparece la descripcion del insumo, pero no el saldo.

Ejemplo: ingreso 12 y egresos (no hay registro), porque si la cantidad fuera 0, si que funciona.

No se si me pude explicar bien, bueno, espero que me puedan ayudar.

Muchas gracias a todos

mjjj
13-11-2008, 17:43:37
Finalmente pude solucionar mi problema con el siguiente codigo:


SELECT M.nom_insum,
(SELECT coalesce(sum(cantidad),0) FROM inventario I WHERE I.id=M.cod_insum and tipo ='I')-
(SELECT coalesce(sum(cantidad),0) FROM inventario i WHERE I.id=M.cod_insum and tipo ='E') AS SALDO,
((SELECT coalesce(sum(cantidad * precio),0) FROM inventario I WHERE I.id=M.cod_insum and tipo ='I')-
(SELECT coalesce(sum(cantidad * precio),0) FROM inventario I WHERE I.id=M.cod_insum and tipo ='E'))/
coalesce((SELECT sum(cantidad) FROM inventario I WHERE I.id=M.cod_insum and tipo ='I')-
(SELECT COALESCE(sum(cantidad),0) FROM inventario i WHERE I.id=M.cod_insum and tipo ='E'),1) as precio
FROM insumos M


Ocupe 2 tablas, una con el detalle de los insumos y la otra con el movimiento de estos. (ingresos y egresos)