none
Consultando qtd disponivel na tabela estoque RRS feed

  • Pergunta

  • Boa tarde,

     

    2 tabelas - produto / estoque

    na minha tabela estoque eu tenho os campos produto, data, turno, disponivel

    e na tabela produto tenho o produto, nome

    produto

    produto        nome

    001              pão

    002              ovo

     

     

    estoque

    produto              data             turno            disponivel

    001                18/07/2010        02                50

    002                20/07/2010        01                10

    001                20/07/2010        01                48

    001                20/07/2010        02                48

    002                21/07/2010        03                30


    eu preciso que o resultado de uma consulta me retorne

    Resultado
    produto   nome            data           turno          disponivel
    002          ovo        21/07/2010        03                30
    001          pão        20/07/2010        02                48

    ou seja... quero que me retorne o quanto eu tenho disponível de cada produto
    no estoque ate a ultima data.

    eu fiz uma consulta que me retorna o disponível de um produto, o da ultima data,
    mas eu não consigo agrupar a consulta por produto - ele so me retorna 1 registro

    ex:
    SELECT Produto, Nome, Data, Turno, Diponivel FROM estoque LEFT JOIN Produto WHERE
    data = (SELECT MAX(data) from estoque) and turno = (SELECT max(turno) from estoque       WHERE data = (SELECT MAX(data) from estoque))

    retorna o que eu peço - o disponivel da ultima data e o ultimo turno dessa data (se tiver mais de 1 turno)

    mas minha cabeça não ta conseguindo a logica para o que eu quero
    é a ultima movimentação de cada produto

    Resultado
    produto   nome            data           turno          disponivel
    002          ovo        21/07/2010        03                30
    001          pão        20/07/2010        02                48

    a ultima data, o ultimo turno da ultima data e o disponivel de cada produto
    ou seja... o que eu tenho de disponivel de cada produto de acordo com minha 
    tabela estoque

    quarta-feira, 21 de julho de 2010 20:10

Respostas

  • Joe, boa noite, segue mais um exemplo p/ sql 2005 e 2008

     

    declare @produto as table (produto char(3), nome varchar(10))
    insert into @produto values('001','pão')
    insert into @produto values('002','ovo')
     
    declare @estoque as table (produto char(3), data datetime, turno int, disponivel int)
    insert into @estoque values ('001','20100718',02,50)
    insert into @estoque values ('002','20100720',01,10)
    insert into @estoque values ('001','20100720',01,48)
    insert into @estoque values ('001','20100720',02,48)
    insert into @estoque values ('002','20100721',03,30)
    
    select 
      x.produto, x.nome, x.data, x.turno, x.disponivel
    from
    (
    SELECT 
      E.produto, P.nome, E.data, E.turno, E.disponivel,
      row_number() over (partition by p.produto order by E.data desc, e.turno desc) as n  
    FROM 
      @estoque AS E INNER JOIN @produto AS P on E.produto = P.produto
    ) as x
    where x.n = 1  
    
    
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Sugerido como Resposta Gustavo Maia Aguiar quinta-feira, 22 de julho de 2010 02:43
    • Marcado como Resposta JoeY... _ sexta-feira, 27 de agosto de 2010 19:39
    quarta-feira, 21 de julho de 2010 22:50

Todas as Respostas

  • Joe

    segue um exemplo

    declare @produto as table (produto char(3), nome varchar(10))
    insert into @produto values('001','pão')
    insert into @produto values('002','ovo')
     
    declare @estoque as table (produto char(3), data datetime, turno int, disponivel int)
    insert into @estoque values ('001','20100718',02,50)
    insert into @estoque values ('002','20100720',01,10)
    insert into @estoque values ('001','20100720',01,48)
    insert into @estoque values ('001','20100720',02,48)
    insert into @estoque values ('002','20100720',03,30)
    select a.produto, b.nome, a.data, a.turno, c.disponivel
     from 
    (
    select produto, max(data) as data,max(turno) as turno--, disponivel 
    from @estoque
    group by produto--,turno
    ) a inner join @produto b on a.produto=b.produto
    inner join @estoque c on a.produto=b.produto and a.data=c.data and a.turno=c.turno
    
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba
    quarta-feira, 21 de julho de 2010 20:41
  • Não vai, esta dando erro na data :o
    quarta-feira, 21 de julho de 2010 21:58
  • Qual o datatype do seu campo data, é datetime? ou varchar?

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba
    quarta-feira, 21 de julho de 2010 22:41
  • Joe, boa noite, segue mais um exemplo p/ sql 2005 e 2008

     

    declare @produto as table (produto char(3), nome varchar(10))
    insert into @produto values('001','pão')
    insert into @produto values('002','ovo')
     
    declare @estoque as table (produto char(3), data datetime, turno int, disponivel int)
    insert into @estoque values ('001','20100718',02,50)
    insert into @estoque values ('002','20100720',01,10)
    insert into @estoque values ('001','20100720',01,48)
    insert into @estoque values ('001','20100720',02,48)
    insert into @estoque values ('002','20100721',03,30)
    
    select 
      x.produto, x.nome, x.data, x.turno, x.disponivel
    from
    (
    SELECT 
      E.produto, P.nome, E.data, E.turno, E.disponivel,
      row_number() over (partition by p.produto order by E.data desc, e.turno desc) as n  
    FROM 
      @estoque AS E INNER JOIN @produto AS P on E.produto = P.produto
    ) as x
    where x.n = 1  
    
    
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Sugerido como Resposta Gustavo Maia Aguiar quinta-feira, 22 de julho de 2010 02:43
    • Marcado como Resposta JoeY... _ sexta-feira, 27 de agosto de 2010 19:39
    quarta-feira, 21 de julho de 2010 22:50
  • data é tipo datetime / uso o sql 2005
    sexta-feira, 23 de julho de 2010 01:32
  • Joey

    Teste a solucao do Leonardo... acredito que vai de ajudar...

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba
    sexta-feira, 23 de julho de 2010 12:02
  • Não entendi o row_number()

    ele não acha essa função, tenho que criar ela... ? o que retorna?

    sexta-feira, 23 de julho de 2010 15:02
  • Joey, se ele nao esta achando a função é pq vc esta usando SQL 2000 ou inferior!
    O Row_number funciona so para sql 2005 ou superior

    att.
    Marcelo Fernandes

     


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba
    sexta-feira, 23 de julho de 2010 15:15