- Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 11 anos, 8 meses atrás por Rodrigo.
-
AutorPosts
-
21 de março de 2013 às 12:23 am #105203RodrigoParticipante
Boa tarde, é meu primeiro post no fórum e desculpe se a pergunta for recorrente, pois dei uma olhada rápida e não encontrei o que precisava.
Tenho uma tabela, que apos minha consulta, retorna os seguintes dados na forma abaixo:
COD_ITEM COD_FORNECEDOR DATA QTDE_ATUAL
/ W700678/S4/42 1 25/02/2013 16:26:30 5
/ W715121/S3/00 1 28/12/2012 11:54:36 8
/ W715121/S3/00 1 28/12/2012 16:54:22 0
/ W715121/S3/00 1 17/01/2013 08:35:18 1
/ W715121/S3/00 1 17/01/2013 09:52:04 2
/ W715121/S3/00 1 17/01/2013 10:18:03 0
B/ OM5W30/BA/1 1 28/09/2012 12:50:46 72
O select que retorna os dados acima esta assim:
SELECT DISTINCT cod_item, cod_fornecedor, data, qtde_atual
FROM itens_historico
WHERE cod_empresa = 5 and cod_operacao <> '21' and cod_operacao <> '31'
ORDER BY cod_item, data
A duvida é seguinte, pra mim só interessam os itens que no ultimo registro de data a qtde_atual seja maior que 0.Nesse caso ai, queria que a resposta da consulta fosse:
COD_ITEM COD_FORNECEDOR DATA QTDE_ATUAL
/ W700678/S4/42 1 25/02/2013 16:26:30 5
B/ OM5W30/BA/1 1 28/09/2012 12:50:46 72
Existe alguma forma de fazer isso na consulta, para que os dados ja venha filtrados?Desde ja agradeco a todos!
Até mais!21 de março de 2013 às 3:22 pm #105207rmanParticipante@rodrigok2
Dependendo da regra de negócio pode ser feito assim:
SELECT DISTINCT cod_item, cod_fornecedor, data, qtde_atual
FROM itens_historico
WHERE cod_empresa = 5 and cod_operacao '21' and cod_operacao '31'
AND data = (SELECT MAX(data) FROM itens_historico WHERE cod_empresa = 5 and cod_operacao '21' and cod_operacao '31' and qtde_atual > 0)
ORDER BY cod_item, data
Ou assim:
SELECT DISTINCT cod_item, cod_fornecedor, data, qtde_atual
FROM itens_historico
WHERE cod_empresa = 5 and cod_operacao '21' and cod_operacao '31'
AND data = (SELECT MAX(data) FROM itens_historico WHERE cod_empresa = 5 and cod_operacao '21' and cod_operacao '31')
and qtde_atual > 0
ORDER BY cod_item, data
Só algumas observações:
– Sempre que puder compare com = e não com . Com = você pode se beneficiar com índice.
– Cuidado com DISTINCT, muitas vezes é empregado de maneira errada.21 de março de 2013 às 3:48 pm #105209RodrigoParticipanteBom dia rman,
na verdade já tinha conseguido ontem a noite, fiz o seguinte:
SELECT cod_item, qtde_atual, data, cod_fornecedor
FROM itens_historico i
WHERE (i.cod_item, i.data) IN(SELECT cod_item, MAX(DATA) FROM itens_historico WHERE cod_empresa = 5 and cod_operacao '21' and cod_operacao '31' GROUP BY cod_item)
Order by cod_item
Sei que subquery com múltiplas colunas afeta em muito o desempenho da consulta, mas assim os resultados foram exatamente o esperado.
Quanto a seus conselhos, estou montando um relatório para um sistema que já existe, a consulta que usei é parte de uma consulta que o sistema faz e que tirei através do SQLMonitor. Por isso que deixei como estava. Mas ficarei atento as dicas!
No mais muito obrigado pela ajuda!
Ate mais!
-
AutorPosts
- Você deve fazer login para responder a este tópico.