Fórum Agrupando datas diferentes e somando #504563
17/12/2014
0
Estou com um problema tenho uma query montada onde me traz o saldo de pedido, saldo de estoque e a diferença que eu preciso produzir, porém existem casos que o mesmo item em prazo de entregas diferentes eu queria agrupar as datas e somar.
Hoje esta assim?
[img]http://arquivo.devmedia.com.br/forum/imagem/402654-20141217-090232.jpg[/img]
Gostaria que ficasse assim porém preservase o campo prz_entrega pois eu consigo que ele agrupe e some porém tenho que tirar o campo prz_entrega e esse campo eu vou precisar utilizar ele para realizar filtros com isso gostaria do resultado abaixo porém com o campo prz_entrega aparecendo.
[img]http://arquivo.devmedia.com.br/forum/imagem/402654-20141217-090306.jpg[/img]
Dagoberto Neto
Curtir tópico
+ 0Post mais votado
17/12/2014
Marisiana Battistella
Gostei + 1
Mais Posts
17/12/2014
Dagoberto Neto
Então não posso colocar uma data especifica, pois esta query vai virar um relatório e este relatório um dos campos que estará disponível para o usuário realizar filtro é o prz_entrega onde ele vai colocar a data que ele quiser entendeu ou seja prz_entrega <= 'Data x'.
Gostei + 0
17/12/2014
Alex Lekao
Entao, acredito que a sugestao da Marisiana sugeriu era para vc usar alguma opcao de max(prz_entrega) por exemplo(isso existe assim no sql server, nao sei se no mysql eh assim tbm. rsrsr) ai vc faz os agrupamentos e calculos que vc deseja e faz uso da maior data.
Se entendi bem, seria por isso a sugestao. rsrsr
Abraco.
Gostei + 0
17/12/2014
Isaac Jose
Gostei + 0
17/12/2014
Isaac Jose
Entao, acredito que a sugestao da Marisiana sugeriu era para vc usar alguma opcao de max(prz_entrega) por exemplo(isso existe assim no sql server, nao sei se no mysql eh assim tbm. rsrsr) ai vc faz os agrupamentos e calculos que vc deseja e faz uso da maior data.
Se entendi bem, seria por isso a sugestao. rsrsr
Abraco.
karaka lekao respondemos ao mesmo tempo...kkkkk
e o seu relatorio funcionou?
abraços
Gostei + 1
17/12/2014
Alex Lekao
num eh cara?? rsrsr
vixi Isaac, qual deles? rsrsr
eu consegui fazer alguns que estava precisando, mas dei uma parada para resolver outras coisas e nao tive como continuar. rsrr
Gostei + 0
17/12/2014
Marisiana Battistella
Então não posso colocar uma data especifica, pois esta query vai virar um relatório e este relatório um dos campos que estará disponível para o usuário realizar filtro é o prz_entrega onde ele vai colocar a data que ele quiser entendeu ou seja prz_entrega <= 'Data x'.
Se o objetivo é obter o total de entregas no período que o usuário filtrou, não tem necessidade de incluir o campo prazo de entrega no SELECT, apenas realiza a restrição do retorno filtrando os dados em que o prazo de entrega esteja no período informado pelo usuário.
Se quiser postar o select que vc está fazendo, fica mais fácil te ajudar....
Gostei + 1
18/12/2014
Dagoberto Neto
SELECT
a.cod_empresa
,a.cod_item
,c.den_item
,c.den_item_reduz
,c.cod_unid_med
,a.prz_entrega
,sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel)saldo_pedidos
,(SELECT (z.qtd_liberada) FROM estoque z WHERE z.cod_empresa = a.cod_empresa AND z.cod_item = a.cod_item) AS saldo_estoque
,((SELECT (z.qtd_liberada) FROM estoque z WHERE z.cod_empresa = a.cod_empresa AND z.cod_item = a.cod_item) - sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel))dif_receb
,(SELECT b.den_estr_linprod FROM linha_prod b WHERE b.cod_lin_prod = c.cod_lin_prod AND b.cod_lin_recei = '0' AND b.cod_seg_merc = '0')teste_a
,(SELECT b.den_estr_linprod FROM linha_prod b WHERE b.cod_lin_prod = c.cod_lin_prod AND b.cod_lin_recei = c.cod_lin_recei AND b.cod_seg_merc = '0')teste_b
FROM ped_itens a
JOIN item c
ON(c.cod_empresa = a.cod_empresa)
AND(c.cod_item = a.cod_item)
AND(c.ies_situacao = 'A')
AND(c.ies_tip_item = 'F')
WHERE (a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) > '0'
GROUP BY
a.cod_empresa
,a.cod_item
,c.den_item
,c.den_item_reduz
,c.cod_unid_med
,a.prz_entrega
,teste_a
,teste_b
Gostei + 0
18/12/2014
Alex Lekao
Nesse caso que vc citou, a opcao max(prz_entrega) ja resolveria, eh claro que nao sei se no mysql eh esse comando tbm. rsrsr
se nao estou enganado ele ja eh um agrupamento, entao ja resolveria o que vc precisa, sem informar no group by.
Acredito que ficaria mais ou menos assim:
SELECT a.cod_empresa ,a.cod_item ,c.den_item ,c.den_item_reduz ,c.cod_unid_med ,max(a.prz_entrega) as prz_entrega ,sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel)saldo_pedidos ,(SELECT (z.qtd_liberada) FROM estoque z WHERE z.cod_empresa = a.cod_empresa AND z.cod_item = a.cod_item) AS saldo_estoque ,((SELECT (z.qtd_liberada) FROM estoque z WHERE z.cod_empresa = a.cod_empresa AND z.cod_item = a.cod_item) - sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel))dif_receb ,(SELECT b.den_estr_linprod FROM linha_prod b WHERE b.cod_lin_prod = c.cod_lin_prod AND b.cod_lin_recei = '0' AND b.cod_seg_merc = '0')teste_a ,(SELECT b.den_estr_linprod FROM linha_prod b WHERE b.cod_lin_prod = c.cod_lin_prod AND b.cod_lin_recei = c.cod_lin_recei AND b.cod_seg_merc = '0')teste_b FROM ped_itens a JOIN item c ON(c.cod_empresa = a.cod_empresa) AND(c.cod_item = a.cod_item) AND(c.ies_situacao = 'A') AND(c.ies_tip_item = 'F') WHERE (a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) > '0' GROUP BY a.cod_empresa ,a.cod_item ,c.den_item ,c.den_item_reduz ,c.cod_unid_med ,teste_a ,teste_b
espero ter ajudado.
Abraco.
Gostei + 0
18/12/2014
Dagoberto Neto
Gostei + 1
18/12/2014
Marisiana Battistella
Se você precisa filtrar as entregar dentre um periodo que o usuário vai informar, vc deve restringir o retorno da consulta filtrando os registros que estão dentre esse periodo.
Ou seja, incluindo
WHERE prz.entrega BETWEEN in_datainicial AND in_datafinal
Outro detalhe que me chamou atenção você definiu
JOIN item c ON(c.cod_empresa = a.cod_empresa) AND(c.cod_item = a.cod_item) AND(c.ies_situacao = ''A'') AND(c.ies_tip_item = ''F'')
Se as restrições AND(c.ies_situacao = ''A'') e AND(c.ies_tip_item = ''F'') são uma regra que a consulta todasdeve atender, elas devem estar definidas na clausula WHERE e não no JOIN entre as tabelas.
Gostei + 1
18/12/2014
Dagoberto Neto
Bom já deu certo com o que você tinha dito antes e com o reforço do Lekão, fiz os testes aqui e me atendeu perfeitamente.
Quanto o between os mesmos não usam pois eles não pegam um intervalo e sim a data atual ou a data da frente para trás ou seja <=.
Quanto as regras de consultas foi bom você me informar, apesar de estar funcionando da forma que esta, porém realmente você tem razão o certo é tratar na cláusula Where.
Vou dar esse assunto como encerrado, como eu sou novo aqui eu tenho que fechar o assunto? Caso sim como faço?
Gostei + 1
18/12/2014
Marisiana Battistella
Utilizar Subselect, dessa forma que vc definiu, não é um boa prática de programação...
Veja um exemplo de como poderia ser construído o SELECT:
SELECT a.cod_empresa,
a.cod_item,
c.den_item,
c.den_item_reduz,
c.cod_unid_med,
sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) as saldo_pedidos,
z.qtd_liberada as saldo_estoque,
( z.qtd_liberada - sum(a.qtd_pecas_solic-a.qtd_pecas_atend-a.qtd_pecas_cancel) as dif_receb,
CASE
WHEN b.cod_lin_recei = '0' THEN
b.den_estr_linprod
END teste_a,
b.den_estr_linprod as teste_b
FROM ped_itens a
JOIN item c
ON(c.cod_empresa = a.cod_empresa)
AND(c.cod_item = a.cod_item)
JOIN estoque z
ON z.cod_empresa = a.cod_empresa
AND z.cod_item = a.cod_item
JOIN linha_prod b
ON b.cod_lin_prod = c.cod_lin_prod
AND b.cod_lin_recei = c.cod_lin_recei
WHERE (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 b.cod_seg_merc = '0'
AND a.prz_entrega BETWEEN '02/03/2014' AND '23/10/2014'
GROUP BY a.cod_empresa,
a.cod_item,
c.den_item,
c.den_item_reduz,
c.cod_unid_med,
teste_a,
teste_bOBS.: Certamente terá erro na sintaxe, pois não testei, fiz a alteração pela lógica da estrutura apresentada e certamente precisa de correções.
Me desculpe se eu estiver sendo inconveniente por expor minha opinião.
Espero estar ajudando!
Gostei + 1
18/12/2014
Marisiana Battistella
Bom já deu certo com o que você tinha dito antes e com o reforço do Lekão, fiz os testes aqui e me atendeu perfeitamente.
Quanto o between os mesmos não usam pois eles não pegam um intervalo e sim a data atual ou a data da frente para trás ou seja <=.
Quanto as regras de consultas foi bom você me informar, apesar de estar funcionando da forma que esta, porém realmente você tem razão o certo é tratar na cláusula Where.
Vou dar esse assunto como encerrado, como eu sou novo aqui eu tenho que fechar o assunto? Caso sim como faço?
Bom dia!
Como preferir Dagoberto!
Estava com a a página desatualizada e não vi tua resposta, por isso postei o ultimo comentário...
São os usuários moderadores e administradores que encerram os tópicos.
Gostei + 0
18/12/2014
Dagoberto Neto
Gostei + 0
18/12/2014
Marisiana Battistella
Se você optar por modificar o seu SELECT e adaptar a estrutura que postei como exemplo, posso te ajudar...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)