Criar um campo somando pedidos e subtraindo pela qtd estoque
Estou com uma duvida, tenho esta query abaixo:
SELECT
a.cod_empresa
,a.cod_item
,c.den_item
,c.cod_unid_med
,a.prz_entrega
,sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel)saldo_pedidos
,d.qtd_liberada AS saldo_estoque
FROM ped_itens a
JOIN item c
ON(c.cod_empresa = a.cod_empresa)
AND(c.cod_item = a.cod_item)
JOIN estoque d
ON(d.cod_empresa = a.cod_empresa)
AND(d.cod_item = a.cod_item)
JOIN grl_atr_ant_cri_massas_rev01 e
ON(e.cod_empresa = a.cod_empresa)
AND(e.cod_item = a.cod_item)
WHERE a.cod_empresa = '02'
AND (a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) > '0'
AND c.ies_situacao = 'A'
AND c.ies_tip_item = 'F'
AND a.cod_item = '4559'
GROUP BY
a.cod_empresa
,a.cod_item
,c.den_item
,c.cod_unid_med
,a.prz_entrega
,saldo_estoque
order by c.den_item, a.prz_entrega
Que me traz esse resultado
[img]http://arquivo.devmedia.com.br/forum/imagem/402654-20150313-095122.jpg[/img]
Quero criar um campo que some os pedidos e subtraia pelo estoque, porém percebe que o estoque se repete, por existir prazos de entregas diferentes, porém preciso que aparece esse valor de estoque apenas uma vez só pois senão vai distorcer no resultado, como faço isto ?
Dagoberto Neto
Respostas
Dagoberto Neto
13/03/2015
Por gentileza, alguém poderia me ajudar de como esta realizando esse procedimento ???
Fernando C
13/03/2015
Dagoberto Neto
13/03/2015
Como sou um cara muito iniciante, realmente preciso me aprofundar cada vez mais, vou ler e vou estudar um pouco mais sobre triggers, porém você tem um exemplo parecido com o que eu preciso, pois as vezes vendo um exemplo as coisas fica mais simples, pois estava dando uma olhada em Triggers rapidamente e as explicações são muito técnicas se tiver algum exemplo parecido com o cenário acima que descrevi ficaria grato.
Abraços
Marisiana Battistella
13/03/2015
Se não tem necessidade de retornar o prazo de entrega, é só somar os valores da coluna saldos_pedidos e diminuir do valor de estoque.
Dagoberto Neto
13/03/2015
Preciso sim dos prazos de entrega, na verdade ele é primordial, sem eles eu até consegui fazer, mas necessito do mesmo. Tem alguma solução rs.
Marisiana Battistella
13/03/2015
Dagoberto Neto
13/03/2015
Marisiana Battistella
13/03/2015
SELECT a.cod_empresa,
a.cod_item,
c.den_item,
c.cod_unid_med,
d.qtd_liberada AS saldo_estoque,
a.prz_entrega,
sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel)saldo_pedidos
FROM ped_itens a
JOIN item c
ON(c.cod_empresa = a.cod_empresa)
AND(c.cod_item = a.cod_item)
JOIN estoque d
ON(d.cod_empresa = a.cod_empresa)
AND(d.cod_item = a.cod_item)
JOIN grl_atr_ant_cri_massas_rev01 e
ON(e.cod_empresa = a.cod_empresa)
AND(e.cod_item = a.cod_item)
WHERE a.cod_empresa = '02'
AND (a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) > '0'
AND c.ies_situacao = 'A'
AND c.ies_tip_item = 'F'
AND a.cod_item = '4559'
GROUP BY a.cod_empresa,
a.cod_item,
c.den_item,
c.cod_unid_med,
d.qtd_liberada,
a.prz_entrega
Até onde sei, essa é a forma mais correta de fazer.
Dagoberto Neto
13/03/2015
somar o saldo de pedido que vai dar 1325 - 1325 pegando o valor do estoque apenas uma vez e não 3975 pois ta repetindo o valor do estoque entendeu precisava criar esta soma.
Marisiana Battistella
13/03/2015
SELECT a.cod_empresa,
a.cod_item,
c.den_item,
c.cod_unid_med,
d.qtd_liberada AS saldo_estoque,
a.prz_entrega,
sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) as saldo_pedidos,
(sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) - d.qtd_liberada ) as saldo_pedidos_2
FROM ped_itens a
JOIN item c
ON(c.cod_empresa = a.cod_empresa)
AND(c.cod_item = a.cod_item)
JOIN estoque d
ON(d.cod_empresa = a.cod_empresa)
AND(d.cod_item = a.cod_item)
JOIN grl_atr_ant_cri_massas_rev01 e
ON(e.cod_empresa = a.cod_empresa)
AND(e.cod_item = a.cod_item)
WHERE a.cod_empresa = '02'
AND (a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) > '0'
AND c.ies_situacao = 'A'
AND c.ies_tip_item = 'F'
AND a.cod_item = '4559'
GROUP BY a.cod_empresa,
a.cod_item,
c.den_item,
c.cod_unid_med,
d.qtd_liberada,
a.prz_entrega
Dagoberto Neto
13/03/2015
[img]http://arquivo.devmedia.com.br/forum/imagem/402654-20150317-122702.jpg[/img]
Marcos P
13/03/2015
Voltando na sua questão original...
[img]http://arquivo.devmedia.com.br/forum/imagem/378439-20150317-180356.jpg[/img]
Quero criar um campo que some os pedidos e subtraia pelo estoque, porém percebe que o estoque se repete, por existir prazos de entregas diferentes, porém preciso que aparece esse valor de estoque apenas uma vez só pois senão vai distorcer no resultado, como faço isto ?
-------------------------
No seu exemplo da imagem, qual o resultado desejado em cada uma das três linhas selecionadas ?
Qual o nome da nova coluna e qual a regra de cálculo considerando as colunas existentes ?
Estou de saída agora, mas dou uma olhada na sua resposta na sequencia....
Aproveito para relatar minha perplexidade com o nível dos comentários do forum... o sujeito falar que para resolver isso aí você deveria estudar triggeres, na minha opinião, seria motivo dele ser banido do site. O gênio que fez esse comentário, poderia me explicar como qualquer tipo de trigger resolveria essa questão ?
Dagoberto Neto
13/03/2015
Vamos lá...
Olhando a imagem que postei note que tenho um mesmo item que se repete com prazos de entregas diferente, preciso do total da soma de pedidos ou seja 300+900+125 = 1325 correto, porém preciso subtrair pelo o que já tenho em estoque que no caso é 1325 apenas, porém o saldo de estoque acaba se repetindo pelo fato dos prazos de entregas serem diferente e distorcendo a soma de seu valor pois ele mostra 3 vezes o valor do estoque. Resumindo precisaria de um campo da seguinte forma saldo_Pedido(1325) - saldo_estoque(1325) = 0, ou senão quando o item for repetido aparecer apenas uma vez saldo_estoque, algo assim.
Grato até o momento.
Neto
Marcos P
13/03/2015
Seu exemplo é confuso, porque tanto o total de "saldos_pedidos" e o "saldo_estoque" tem o mesmo valor.
Preparei um outro set de dados, abaixo.
cod_item prz_entrega saldo_pedidos saldo_estoque nova_coluna
-------- ------------- ------------- ------------- -------------
4559 20/03/2015 500 1325
4559 20/03/2015 100 1325
4559 20/03/2015 450 1325
Qual o nome do campo "nova_coluna" ?
Isso é importante, porque o nome pode dar uma ideia da definição do cálculo usado.
Qual o valor de "nova_coluna", para cada uma dessas três linhas ?
Fico no aguardo.
Marcos P
13/03/2015
Dagoberto Neto
13/03/2015
A nova coluna vai se chamar Saldo a produzir ou seja quando o saldo_estoque - saldo_do pedido der zero não preciso produzir nada agora quando for menor que zero eu saberei a diferença a produzir, porém eu preciso do saldo total do pedido, subtraindo apenas uma vez o valor do estoque e não que o valor de saldo_estoque se repita nas linhas pois o valor de estoque é um só, ele se repete por causa dos prazos de entregas diferentes entendeu.
Marcos P
13/03/2015
cod_item prz_entrega saldo_pedidos saldo_estoque saldo_produzir
-------- ------------- ------------- ------------- -------------
4559 20/03/2015 500 1325
4559 24/03/2015 100 1325
4559 25/03/2015 450 1325
Marcos P
13/03/2015
Você consegue preencher o exemplo que lhe pedi ou existe algum tipo de erro na definição que lhe passei ?
( ou mesmo na sua definição original... )
Marisiana Battistella
13/03/2015
Sempre que você incluir esse campo vai acontecer de listar mais de uma linha, e isso não está errado pois são datas diferentes.
Se você fosse listar isso em um relatório, poderia mostrar essas informações utilizando dois selects: o primeiro retornando os valores calculados por item e o segundo retornando os prazos de entrega de cada item.
Marcos P
13/03/2015
É trivial resolver isso com dois selects ou com uma subquery !
A questão é que, aparentemente, existe um erro na formulação da pergunta original, afinal, o exemplo inicial não deixa claro por quê os dois saldos são iguais ?
Se o Neto preencher o novo exemplo que coloquei, fica mais fácil de ajudá-lo...
Marisiana Battistella
13/03/2015
Marcos P
13/03/2015
Dagoberto Neto
13/03/2015
Mais uma vez me desculpe
Marcos P
13/03/2015
cod_item prz_entrega saldo_pedidos saldo_estoque saldo_produzir
-------- ------------- ------------- ------------- -------------
4559 20/03/2015 500 1325
4559 24/03/2015 100 1325
4559 25/03/2015 450 1325
Dagoberto Neto
13/03/2015
Quando o valor do saldo a produzir for positivo como na imagem eu não preciso produzir, quando der negativo eu preciso produzir.
Marcos P
13/03/2015
Vou testar aqui e já te mando a query !
Marcos P
13/03/2015
SELECT a.cod_empresa ,a.cod_item ,c.den_item ,c.cod_unid_med ,a.prz_entrega ,sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel)saldo_pedidos ,d.qtd_liberada AS saldo_estoque ,(SELECT sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) FROM ped_itens a JOIN item c ON(c.cod_empresa = a.cod_empresa) AND(c.cod_item = a.cod_item) JOIN estoque d ON(d.cod_empresa = a.cod_empresa) AND(d.cod_item = a.cod_item) JOIN grl_atr_ant_cri_massas_rev01 e ON(e.cod_empresa = a.cod_empresa) AND(e.cod_item = a.cod_item) WHERE a.cod_empresa = '02' AND (a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) > '0' AND c.ies_situacao = 'A' AND c.ies_tip_item = 'F' AND a.cod_item = '4559' GROUP BY a.cod_empresa,a.cod_item,c.den_item,c.cod_unid_med) as Total_Saldo_Pedidos FROM ped_itens a JOIN item c ON(c.cod_empresa = a.cod_empresa) AND(c.cod_item = a.cod_item) JOIN estoque d ON(d.cod_empresa = a.cod_empresa) AND(d.cod_item = a.cod_item) JOIN grl_atr_ant_cri_massas_rev01 e ON(e.cod_empresa = a.cod_empresa) AND(e.cod_item = a.cod_item) WHERE a.cod_empresa = '02' AND (a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) > '0' AND c.ies_situacao = 'A' AND c.ies_tip_item = 'F' AND a.cod_item = '4559' GROUP BY a.cod_empresa ,a.cod_item ,c.den_item ,c.cod_unid_med ,a.prz_entrega ,saldo_estoque order by c.den_item, a.prz_entrega
Dagoberto Neto
13/03/2015
Dagoberto Neto
13/03/2015
[img]http://arquivo.devmedia.com.br/forum/imagem/402654-20150319-121137.jpg[/img]
Marisiana Battistella
13/03/2015
Mais uma vez me desculpe
Não se preocupe com isso Neto, estamos aqui para aprender e todos são sempre bem vindos!
Veja se uma solução assim te ajuda... Pode ser que dê erro porque não tenho não tenho como testar aqui...
Eu acho que vai duplicar as linhas, mas vai calcular os valores corretos.
select res.cod_empresa,
res.cod_item,
res.den_item,
res.cod_unid_med,
res.saldo_estoque,
res.saldo_pedidos,
(res.saldo_estoque - res.saldo_pedidos) as diferenca_saldo,
pi.prz_entrega
from ped_itens pi
join ( SELECT a.cod_empresa,
a.cod_item,
c.den_item,
c.cod_unid_med,
d.qtd_liberada AS saldo_estoque,
sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) as saldo_pedidos
FROM ped_itens a
JOIN item c
ON(c.cod_empresa = a.cod_empresa)
AND(c.cod_item = a.cod_item)
JOIN estoque d
ON(d.cod_empresa = a.cod_empresa)
AND(d.cod_item = a.cod_item)
JOIN grl_atr_ant_cri_massas_rev01 e
ON(e.cod_empresa = a.cod_empresa)
AND(e.cod_item = a.cod_item)
WHERE a.cod_empresa = '02'
AND (a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) > '0'
AND c.ies_situacao = 'A'
AND c.ies_tip_item = 'F'
AND a.cod_item = '4559'
GROUP BY a.cod_empresa,
a.cod_item,
c.den_item,
c.cod_unid_med,
d.qtd_liberada ) res
ON(res.cod_empresa = pi.cod_empresa)
AND(res.cod_item = pi.cod_item)
Marcos P
13/03/2015
"Total_Saldo_Pedidos" é uma sub-query... ou seja, para cada linha da query principal, vai ser executado um select especifico totalizando "saldo_pedidos".
Entendendo isso, você, que tem a base de dados para testes, consegue trabalhar com a ligação certa dos dados e o nivel de detalhe desejado na totalização !
Tenta assim...
SELECT a.cod_empresa ,a.cod_item ,c.den_item ,c.cod_unid_med ,a.prz_entrega ,sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel)saldo_pedidos ,d.qtd_liberada AS saldo_estoque ,(SELECT sum(a1.qtd_pecas_solic-a1.qtd_pecas_atend-a1.qtd_pecas_cancel) FROM ped_itens a1 JOIN item c1 ON(c1.cod_empresa = a1.cod_empresa) AND(c1.cod_item = a1.cod_item) JOIN estoque d1 ON(d1.cod_empresa = a1.cod_empresa) AND(d1.cod_item = a1.cod_item) JOIN grl_atr_ant_cri_massas_rev01 e1 ON(e1.cod_empresa = a1.cod_empresa) AND(e1.cod_item = a1.cod_item) WHERE a1.cod_empresa = a.cod_empresa AND (a1.qtd_pecas_solic-a1.qtd_pecas_atend-a1.qtd_pecas_cancel) > '0' AND c1.ies_situacao = c.ies_situacao AND c1.ies_tip_item = c.ies_tip_item AND a1.cod_item = a.cod_item GROUP BY a1.cod_empresa,a1.cod_item,c1.den_item,c1.cod_unid_med) as Total_Saldo_Pedidos FROM ped_itens a JOIN item c ON(c.cod_empresa = a.cod_empresa) AND(c.cod_item = a.cod_item) JOIN estoque d ON(d.cod_empresa = a.cod_empresa) AND(d.cod_item = a.cod_item) JOIN grl_atr_ant_cri_massas_rev01 e ON(e.cod_empresa = a.cod_empresa) AND(e.cod_item = a.cod_item) WHERE a.cod_empresa = '02' AND (a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) > '0' AND c.ies_situacao = 'A' AND c.ies_tip_item = 'F' AND a.cod_item = '4559' GROUP BY a.cod_empresa ,a.cod_item ,c.den_item ,c.cod_unid_med ,a.prz_entrega ,saldo_estoque order by c.den_item, a.prz_entrega
Dagoberto Neto
13/03/2015
[img]http://arquivo.devmedia.com.br/forum/imagem/402654-20150319-122408.jpg[/img]
SELECT
a.cod_empresa
,a.cod_item
,c.den_item
,c.cod_unid_med
,a.prz_entrega
,sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel)saldo_pedidos
,d.qtd_liberada AS saldo_estoque
,(SELECT sum(a1.qtd_pecas_solic-a1.qtd_pecas_atend-a1.qtd_pecas_cancel)
FROM ped_itens a1
JOIN item c1 ON(c1.cod_empresa = a1.cod_empresa) AND(c1.cod_item = a1.cod_item)
JOIN estoque d1 ON(d1.cod_empresa = a1.cod_empresa) AND(d1.cod_item = a1.cod_item)
JOIN grl_atr_ant_cri_massas_rev01 e1 ON(e1.cod_empresa = a1.cod_empresa) AND(e1.cod_item = a1.cod_item)
WHERE a1.cod_empresa = a.cod_empresa
AND (a1.qtd_pecas_solic-a1.qtd_pecas_atend-a1.qtd_pecas_cancel) > '0'
AND c1.ies_situacao = c.ies_situacao
AND c1.ies_tip_item = c.ies_tip_item
AND a1.cod_item = a.cod_item
GROUP BY a1.cod_empresa,a1.cod_item,c1.den_item,c1.cod_unid_med) as Total_Saldo_Pedidos
FROM ped_itens a
JOIN item c
ON(c.cod_empresa = a.cod_empresa)
AND(c.cod_item = a.cod_item)
JOIN estoque d
ON(d.cod_empresa = a.cod_empresa)
AND(d.cod_item = a.cod_item)
JOIN grl_atr_ant_cri_massas_rev01 e
ON(e.cod_empresa = a.cod_empresa)
AND(e.cod_item = a.cod_item)
WHERE a.cod_empresa = '02'
AND (a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) > '0'
AND c.ies_situacao = 'A'
AND c.ies_tip_item = 'F'
AND a.cod_item = '727'
AND a.prz_entrega = '30-03-2015'
GROUP BY
a.cod_empresa
,a.cod_item
,c.den_item
,c.cod_unid_med
,a.prz_entrega
,saldo_estoque
order by c.den_item, a.prz_entrega
Dagoberto Neto
13/03/2015
[img]http://arquivo.devmedia.com.br/forum/imagem/402654-20150319-123615.jpg[/img]
Marcos P
13/03/2015
A query original é sua ?
Se a resposta a essas duas questões for "sim", você ( que tem a base de dados para testes ), tem total condição de adaptar a subquery para totalizar corretamente "saldo_pedidos".
Uma vez a subquery finalizada para totalizar "saldo_pedidos", você resolveu seu problema, pois a partir de qualquer linha da query principal você consegue fazer a subtração que vai indicar se você precisa, ou não, produzir determinado item...
Analise com calma e trabalhe na subquery.
Senão rolar, tente a solução da Marisiana... afinal, o que importa é resolvermos seu problema !
Marcos P
13/03/2015
Existe a possibilidade de repetir o "275" o que resolve o problema, conforme expliquei acima...
Marcos P
13/03/2015
Marisiana Battistella
13/03/2015
O ideal é você fazer o calculo correto e trazer todas as informações e depois tratar isso na aplicação, onde você irá criar a visualização desses dados.
Marcos P
13/03/2015
Eu não entendo a pessoa que posta uma dúvida qualquer no forum e encontra outras duas pessoas dispostas a ajudar e, simplesmente, não dá retorno algum sobre o que foi postado !
Não entendo...
Espero que você tenha conseguido resolver seu problema e te garanto que da minha parte não rola mais nenhum ajuda !
Marisiana Battistella
13/03/2015