Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta 3 tablas (https://www.clubdelphi.com/foros/showthread.php?t=63651)

mjjj 24-02-2009 22:38:50

Consulta 3 tablas
 
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.
Código SQL [-]
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.

Código SQL [-]
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

Código SQL [-]
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:

Código SQL [-]
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.

Saludos.


La franja horaria es GMT +2. Ahora son las 17:23:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi