PDA

Ver la Versión Completa : Consulta 3 tablas


mjjj
24-02-2009, 22:38:50
Hola, yo denuevo por aca molestado. Espero que me puedan ayudar, ya que llevo mucho rato tratando de resolver esto y no he podido.
Tengo un que realizar una consulta a 3 tablas simultaneamente... productos, detproductos e inv_prod.

La tabla productos contiene un listado de todos los productos de la empresa, contiene los campos descripcion y codigo, con el cual se relaciona.

La tabla detproductos contiene los campos codigo, cantidad e ID; y es la receta para poder generar el producto, es decir, para poder tener disponible un producto codigo = "0001", debo tener disponible (en inventario) la totalidad de los distintos insumos que generan el producto, y ademas con la restriccion de que al campo cantidad, es el que limita cuantos insumos (ID) en particular necesito.

Y por ultimo la tabla inv_prod, es la encargada de registrar todos los movimientos en el inventario, si es tipo I es ingreso; si es tipo E es egreso.

Los movimientos son con respecto a los insumos, no los productos, ya que las sumatoria de distintos insumos, generan un producto... esto lo define la tabla detproducto (es como la receta del producto).

La tabla inv_pro tiene los campos codigo, id, tipo, cantidad


Expongo un codigo que como que quiere funcionar pero va no del todo bien. Ojale me puedan echar una manito.

select DISTINCT P.CODIGO, P.DESCRIPCION,
coalesce(min(trunc(I.CANTIDAD/D.CANTIDAD)),0)
FROM productos P left join (detproductos d
left JOIN INV_PROD I
ON D.EMPRESA = I.EMPRESA AND D.CODIGO = I.CODIGO AND D.ID = I.ID)
on P.EMPRESA = D.EMPRESA and p.codigo = d.codigo
where D.EMPRESA = 'emp1'
and i.id = d.id
GROUP BY P.CODIGO, I.ID, P.DESCRIPCION, D.CANTIDAD
having ((COALESCE(sum(iif(TIPO ='I',I.cantidad,0)),0)
-COALESCE(sum(iif(TIPO ='E',I.cantidad,0)),0)) / D.CANTIDAD >=1)


Cualquier comentario, sugerencia o idea es bienvenida.

Saludos y gracias

mjjj
25-02-2009, 19:58:53
Amigos despuse de mucho probar llegue a un codigo que debe funcionar, pero es muy lento ya que tiene consultas anidadas.

Al tener pocos registros funciona de maravilla, agregen un alto numero de registros y simplemente se tranco el PC. Expongo el codigo.


SELECT DISTINCT D.CODIGO,
COALESCE(MIN((SELECT (SUM(IIF(TIPO='I', cantidad, 0))-(SUM(IIF(TIPO='E',CANTIDAD,0))))
FROM inv_prod WHERE EMPRESA=D.EMPRESA AND CODIGO=D.CODIGO AND ID = D.ID)/D.CANTIDAD),0)

FROM DETPRODUCTOS D INNER JOIN INV_PROD I ON D.EMPRESA = I.empresa
AND I.ID = D.ID AND I.CODIGO = D.CODIGO
WHERE D.EMPRESA = 'emp1'
GROUP BY D.CODIGO
HAVING (SUM(IIF(I.TIPO='I', I.cantidad, 0))-(SUM(IIF(I.TIPO='E',I.CANTIDAD,0)))) >= 0



Luego, tratando de evitar consultas anuladas, utilice este codigo


SELECT DISTINCT D.CODIGO,
COALESCE(MIN(i.cantidad/d.cantidad),0)
FROM DETPRODUCTOS D INNER JOIN INV_PROD I ON D.EMPRESA = I.empresa
AND I.ID = D.ID AND I.CODIGO = D.CODIGO
WHERE D.EMPRESA = 'emp1'
GROUP BY D.CODIGO
HAVING (SUM(IIF(I.TIPO='I', I.cantidad, 0))-(SUM(IIF(I.TIPO='E',I.CANTIDAD,0)))) >= 0


El resultado fue que para cada registro que cumpla con la condiciones del "having", realiza el cuociente y obtengo un minimo que no es real.

Por ultimo, y creo que de esta manera debiera funcionar, es que llegue a este codigo:


SELECT DISTINCT I.CODIGO,
MIN(SUM(IIF(I.TIPO='I', I.cantidad, 0))-(SUM(IIF(I.TIPO='E',I.CANTIDAD,0))))

FROM INV_PROD I
WHERE I.EMPRESA = 'emp1'
GROUP BY I.CODIGO


es asunto aqui es que me arroja un error...

"SQL error code = -104.
Nested aggregate functions are not allowed."

Bueno eso es lo que me podido sacar en limpio, ojala alguien me pueda ayudar a solucionar este tema que me tiene de loko.

Saludos y muchas gracias de ante mano.

cdac901
22-03-2009, 07:23:33
El error que te da es porque no puedes utilizar este tipo de sentecias min(sum(i.cantidad)) Chequea la referencia SQL Error 36 de este enlace (http://publib.boulder.ibm.com/infocenter/soliddb/v6r3/index.jsp?topic=/com.ibm.swg.im.soliddb.admin.doc/doc/solid.sql.errors.html).

Saludos.