Agrupando datas diferentes e somando
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
Melhor post
Marisiana Battistella
17/12/2014
Mais Respostas
Dagoberto Neto
17/12/2014
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'.
Alex Lekao
17/12/2014
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.
Isaac Jose
17/12/2014
Isaac Jose
17/12/2014
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
Alex Lekao
17/12/2014
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
Marisiana Battistella
17/12/2014
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....
Dagoberto Neto
17/12/2014
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
Alex Lekao
17/12/2014
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.
Dagoberto Neto
17/12/2014
Marisiana Battistella
17/12/2014
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.
Dagoberto Neto
17/12/2014
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?
Marisiana Battistella
17/12/2014
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!
Marisiana Battistella
17/12/2014
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.
Dagoberto Neto
17/12/2014
Marisiana Battistella
17/12/2014
Se você optar por modificar o seu SELECT e adaptar a estrutura que postei como exemplo, posso te ajudar...
Alex Lekao
17/12/2014
precisando de algo eh so falar.
Estamos sempre na area. rsrsr
eu menos que a maioria, mas to sempre por ai. rrsrsr
Abraco.
Dagoberto Neto
17/12/2014
OBRIGADO.
Marisiana Battistella
17/12/2014
Dagoberto Neto
17/12/2014
Marisiana Battistella
17/12/2014
Você está fazendo a consulta dentro de um período de prazos de entrega que é definido pelo usuário.
AND a.prz_entrega BETWEEN '02/03/2014' AND '23/10/2014'
Então,a regra é que o prazo final da pesquisa deverá ser a data final informada pelo usuário.
Se o usuário quiser saber os valores até o dia 19, a data final da pesquisa deverá ser o dia 19....
Dagoberto Neto
17/12/2014
Alex Lekao
17/12/2014
Rapaz eu nao entendi, os calculos que acontecem no select so sao executados depois da execucao do Where, nao teria porque fazer com 30 e nao fazer com 19, seria possivel vc postar parte do codigo novamente para entender melhor?
Nao sei se no MySQL eh assim, No SQL Server se tiver algum resultado Null que estiver sendo somando o resultado sempre sera Null, nesse caso temos que tratar o Null antes da soma, calculo, nao sei se eh o caso, mas, fica ai a sugestao.
Abraco.
Marisiana Battistella
17/12/2014
Mas por que você está trabalhando com a função MAX se vc está filtrando por periodo?
Dagoberto Neto
17/12/2014
Marisiana, usei a função max pois lembra no começo do post que eu não conseguia agrupar o mesmo código do item com datas diferentes do mesmo código para ser somado a soma.
Marisiana Battistella
17/12/2014
Mas se você fez o select semelhante ao exemplo q t passei não precisa utilizar a função MAX.
Dagoberto Neto
17/12/2014
Para o usuário na hora de execução do relatorio aparece a janela prz_entrega para o mesmo digitar a data.
Marisiana Battistella
17/12/2014
AND a.prz_entrega BETWEEN '02/03/2014' AND '23/10/2014'
Dagoberto Neto
17/12/2014
Alex Lekao
17/12/2014
Deixa eu ver se entendi, vc usa o campo prz_entrega para ser apresentado em um relatorio externo, por isso vc precisa que ele apareca na selecao, certo?
Dagoberto Neto
17/12/2014
Marisiana Battistella
17/12/2014
Posta o SQL q vc esta utilizando para fazer a consulta, para facilitar a compreensão.
Dagoberto Neto
17/12/2014
item 1090, quantidade 5, prz_entrega 15/01/2015
item 1090, quantidade 3, prz_entrega 18/01/2015
item 1090, quantidade 1, prz_entrega 20/01/2015
Se o usuario filtrar prz_entrega <= '15/01/2015' ira mostrar:
item 1090, quantidade 5, prz_entrega 15/01/2015
Se o usuario filtrar prz_entrega <= '18/01/2015' ira mostrar:
item 1090, quantidade 8, prz_entrega 15/01/2015
Se o usuario filtrar prz_entrega <= '20/01/2015' ira mostrar:
item 1090, quantidade 9, prz_entrega 15/01/2015
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
,d.qtd_liberada AS saldo_estoque
,d.qtd_liberada - 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)
JOIN estoque d
ON(d.cod_empresa = a.cod_empresa)
AND(d.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'
GROUP BY
a.cod_empresa
,a.cod_item
,c.den_item
,c.den_item_reduz
,c.cod_unid_med
,a.prz_entrega
,saldo_estoque
,teste_a
,teste_b
order by den_item_reduz, teste_b
Alex Lekao
17/12/2014
Se vc utilizar o Prz_Entrega no filtro(where), como a Marisiana esta sugerindo, a consulta com MAX(Prz_Entrega) na selecao aparecera somente aquilo que estiver no filtro, ou seja, se vc filtrar ate dia 30, o Prz_Entrega que for maior sera do dia 30, se filtrar ate o dia 19, o maior sera do dia 19, eh claro que para aqueles itens que tiverem as previsoes para essas datas.
Acredito que teria que funcionar, o problema no meu caso eh que nao conheco a estrutura do MySQL para tratar algumas informacoes.
Me lembro de algumas instrucoes que usava no SQL Server sem problemas, sem funcoes especificas SQL Server, nao funcionaram da mesma forma no MySQL, nao sei se seria esse o caso, o problema que tive foi justamente com soma e agrupamento.
Isaac Jose
17/12/2014
mais pelo que vi vc quer trazer sempre o min de prazo de entrega joga um select min desse cara no where.
Dagoberto Neto
17/12/2014
Isaac, não quero usar o mínimo não quero ter praticidade em usar as datas conforme a necessidade, vc citou algo para fazer após o where o que seria ???
Marisiana Battistella
17/12/2014
AND a.prz_entrega <= v_datalimite
Assim, no caso q estamos comentando, se o usuário quiser saber os valores até o prazo de entrega 19 ele deve informa uma data que seja menor q 30.
Dagoberto Neto
17/12/2014
Marisiana Battistella
17/12/2014
Mas vc precisa fazer isso na consulta e não no ambiente WEB, porque se não fizer isso na consulta, os resultados nunca vão retornar corretamente, a consulta, tem q mostrar exatamente a informação que vc precisa listar no relatório.
Essa data que o usuário digita é a data que vc tem que passar como parâmetro para a consulta em
AND a.prz_entrega <= v_datalimite
Dagoberto Neto
17/12/2014
Dagoberto Neto
17/12/2014
Isaac Jose
17/12/2014
o dado que o usuario quer ver nao vai ser o parametro para compraração? vc pega esse cara faz o criterio que a marisiana mandou e na hora de mostrar o menor prazo
vc joga ele como o menor dessa seleção where pzr_a_ser_visualizado = (select min(prz_entrega)Menor_prz_entrega from table
where aqui vc joga a condição que chega ao resultado do que vc postou como exemplo )
item 1090, quantidade 5, prz_entrega 15/01/2015
item 1090, quantidade 3, prz_entrega 18/01/2015
item 1090, quantidade 1, prz_entrega 20/01/2015
Se o usuario filtrar prz_entrega <= '15/01/2015' ira mostrar:
item 1090, quantidade 5, prz_entrega 15/01/2015
Se o usuario filtrar prz_entrega <= '18/01/2015' ira mostrar:
item 1090, quantidade 8, prz_entrega 15/01/2015
Se o usuario filtrar prz_entrega <= '20/01/2015' ira mostrar:
item 1090, quantidade 9, prz_entrega 15/01/2015
qualquer coisa envia um script com umas table de exemplo e alguns inserts.
Marisiana Battistella
17/12/2014
Se o usuário digita a data 19/01/2015, vc precisa q a consulta retorne os pedidos que possui o prazo de entrega nesta data, certo?
Dagoberto Neto
17/12/2014
Marisiana Battistella
17/12/2014
Você precisa passar a data que o usuário informar como parâmetro para o teu SQL. Essa data será recebida como parâmetro pela variável v_datalimite (ou qualquer outro nome q vc definir).
Aconselho a criar uma procedure que receba essa data como parâmetro, execute a consulta e retorne os dados da consulta.
Na tela, no ambiente WEB, ao invés do usuário digitar a data, você pode colocar um campo de seleção com as datas que já estão armazenadas na tabela (campo prz_entrega). Assim, o usuário vai ver quais são os dias q ele tem pedidos com prazo a cumprir e vai selecionar a data q ele quiser para visualizar os pedidos.
Dagoberto Neto
17/12/2014
Marisiana Battistella
17/12/2014
Nesse caso, te aconselho a aprender a utilizar, são vc vai dar uma volta enorme para fazer uma funcionalidade q pode ser simples de criar.
Marisiana Battistella
17/12/2014
Dagoberto Neto
17/12/2014
Marisiana Battistella
17/12/2014
Vou t passar um exemplo, assim q eu conseguir sobrar um tempinho aqui...
Dagoberto Neto
17/12/2014
OK e muito obrigado pela ajuda sem vcs aqui do grupo eu estaria perdidinho aqui RS.
Alex Lekao
17/12/2014
Cara, eu ainda acho que esta havendo um pouco de desentendimento, mas manda brasa, conhecimento nao ocupa espaco. rsrsr
Se vc quise, tem meu contato, skype, no forum e pode me adicionar que ajudo mais efetivamente, acredito. rsrsr
Abraco.
Dagoberto Neto
17/12/2014
Alex Lekao
17/12/2014
Dagoberto Neto
17/12/2014
Alex Lekao
17/12/2014
ja aceitei. rsrr
Marisiana Battistella
17/12/2014