Pular para o conteúdo
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #105203
    Avatar de RodrigoRodrigo
    Participante

      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!

      #105207
      Avatar de rmanrman
      Participante

        @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.

        #105209
        Avatar de RodrigoRodrigo
        Participante

          Bom 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!

        Visualizando 3 posts - 1 até 3 (de 3 do total)
        • Você deve fazer login para responder a este tópico.
        plugins premium WordPress