Foros Club Delphi

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

fjcg02 20-01-2009 08:29:53

Eh! Bpascal, estupendísima explicación. Además eres el único que has dado en el clavo.
Yo creo que hemos aprendido todos algo con tu aportación.

Saludos

Bpascal 20-01-2009 17:52:31

Cita:

Muchas gracias por tu tan clara explicación, pero ocurre algo, al tratar de hacer la consulta en el IBExpert, me arroja un error en la primera linea, No reconoce el campo "C.T_monto_compr", que es el campo de la sumatoria de la tabla compras "sum(Monto_compr) as T_monto_compr".
Revisa bien si es un error de deletreo de nombres, espero que eso sea, el codigo lo probé en MsSql 2005, asegurate que el SELECT donde se resume la tabla de compras esta entre parentesis y que el alias "C" esta DESPUES de cerrar parentesis.

Cita:

y lo ultimo, donde agrego la considion del campo estado de la tabla compras?
ya que son 2 condiciones distintas, 'F' para la suma y 'P' para el count.
En el SELECT donde se resume la tabla compras, toma nota que es muy similar a tu codigo original la diferencia es que el select anidado que utilizabas se movió del select principal y aqui no lleva condiciones.

mjjj 21-01-2009 12:44:38

Bpascal, lo he verificado varias veces, y no es un problema de deletreo, incluso probe con otro ejemplo utilizando la misma idea y tampoco funciona.

Al parecer Firebird 2.0, no soporta este tipo de consultas.

Podrá ser esto??

fjcg02 21-01-2009 21:39:52

Pero esto sí debe de 'tragar'
Código SQL [-]
select p.area , P.monto, 
                sum(case when estado = 'F' then monto_compr else 0 end) AS COMPRA,
               count(case when estado = 'P' then 1 else 0 end) AS EXCEDIDA
from presupuesto p inner join compras c on p.empresa=c.empresa and c.area = p.area and c.ano = p.ano
and p.mes = c.mes AND P.EMPRESA = C.EMPRESA AND P.AREA=C.AREA and p.oficina = c.oficina
where p.mes = '1'
and p.ano =   '2009'
and P.empresa = 'emp1'
and p.oficina = '1'
GROUP BY P.AREA, P.MONTO

Date cuenta de que he quitado la función de agregado al campo monto y lo he añadido al group by.

Ya nos contarás.

Saludos

mjjj 22-01-2009 12:04:04

Amigos, no me funciona para nada. La idea que mas me gusta fue la de Bpascal, pero tampoco resulto, revise que estuviera todo bien escrito, y asi es.

Será que utilizo Firebird 2.0, que no permite este tipo de consultas.

Si es asi que me recomiendan hacer?

Gracias

mjjj 28-01-2009 16:40:24

Retomando este tema que me tiene bastante afligido, voy a plantear otra pregunta, que de poder encontrar una solucion, se me facilitaria mi problema general.

Presento la consulta SQL que requiero, pero que me arroja un error.

Código SQL [-]
select INGRESO - EGRESO, sum(case when tipo = 'I' THEN CANTIDAD ELSE 0 END) as INGRESO,
sum(case when tipo = 'E' THEN CANTIDAD ELSE 0 END) as EGRESO
from INVENTARIO WHERE EMPRESA = 'EMP1'

Lo que ocurre es que no puedo usar los campos calculos para volver a realizar otrso calculos con ellos.

Como puedo hacer esta consulta de otra manera, lo mas eficiente posible?

Gracias

AzidRain 28-01-2009 23:22:31

Código SQL [-]
select INGRESO - EGRESO, sum( if(tipo = 'I', CANTIDAD,0)) as INGRESO,
sum( if(tipo= 'E', CANTIDAD, 0) ) as EGRESO
from INVENTARIO WHERE EMPRESA = 'EMP1'

No se si la sintaxis de IF sea la misma en FB, pero checale.

mjjj 29-01-2009 19:42:26

Hola pude solucionar mi problema con el siguiente codigo

Código SQL [-]
select i.cod_insum,i.nom_insum, i.unidad, i.CRITICO, i.rotacion,
(sum( iif(M.tipo = 'I', CANTIDAD,0))) as INGRESO,
(sum( iif(M.tipo= 'E',  CANTIDAD,0))) as EGRESO,
((sum( iif(M.tipo = 'I', CANTIDAD,0))) - (sum( iif(M.tipo = 'E', CANTIDAD,0)))) AS SALDO,
((sum( iif(M.tipo = 'I', PRECIO*CANTIDAD,0))) - (sum( iif(M.tipo = 'E', PRECIO*CANTIDAD,0))))/
(IIF((sum( iif(M.tipo = 'I', CANTIDAD,0))) - (sum( iif(M.tipo = 'E', CANTIDAD,0)))=0,1,(
(sum( iif(M.tipo = 'I', CANTIDAD,0))) - (sum( iif(M.tipo = 'E', CANTIDAD,0)))))) AS UNIT_POND,
(((sum( iif(M.tipo = 'I', PRECIO*CANTIDAD,0))) - (sum( iif(M.tipo = 'E', PRECIO*CANTIDAD,0))))/
(IIF((sum( iif(M.tipo = 'I', CANTIDAD,0))) - (sum( iif(M.tipo = 'E', CANTIDAD,0)))=0,1,(
(sum( iif(M.tipo = 'I', CANTIDAD,0))) - (sum( iif(M.tipo = 'E', CANTIDAD,0)))))))*
(((sum( iif(M.tipo = 'I', CANTIDAD,0))) - (sum( iif(M.tipo = 'E', CANTIDAD,0))))) AS SUBTOTAL
 
from insumos i INNER join inventario m
ON I.cod_insum = M.ID
WHERE M.EMPRESA = 'emp'
 AND I.EMPRESA = 'emp'
GROUP BY i.cod_insum,i.nom_insum, i.unidad, i.CRITICO, i.rotacion

Funciona perfecto e instantaneo, el unico problema es que solo me muestra los insumos que tengan algun tipo de movimiento, es decir, que exitan algun registro de ese insumo en particular en la tabla invetario.

La tabla insumos contiene la informacion de todos los insumos existentes, y la tabla inventario todos los movimientos de los insumos (tipo = 'I' si es un ingreso, y tipo = 'E' si es un egreso)

El asunto es que si no hay ningun movimiento (no hay registro de algun insumo en particular en la tabla inventario), no aparece en mi consulta.

Como puedo hacer la consulta para que arroje todos los insumos, incluso aquellos que no tienen moviemiento.

Espero que se haya entendido.

Saludos, y gracias

fjcg02 29-01-2009 21:50:08

Tendrás que utilizar LEFT JOIN en lugar de INNER JOIN.
No sé cual es la tabla que tienes que poner a cada lado, pero tienes el 50% por cierto de posibilidades de acertar a la primera.

Saludos


La franja horaria es GMT +2. Ahora son las 08:41:40.

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