none
Data mais recente RRS feed

  • Pergunta

  • Pessoal,

     

    Possuo 2 tabelas (Produtos e Compras), onde:
    - Produtos é o meu cadastro e o Código não se repete.
    - Compras é o registro de compras para os produtos com sua respectiva Data.

    Preciso selecionar todos os produtos com a data de compra mais recente de cada um deles.

    Ex.:


    Produtos:
    idNumerador  Codigo
    ----------- ------
    1            111
    2            222
    3            333

    Compras
    idNumerador idProduto Data
    ----------- --------- --------
    1            1        01/12/2008
    2            1        12/12/2008 *
    3            2        01/11/2008
    4            2        25/11/2008 *
    5            3        10/12/2008 *

    Retornar:

    Codigo  Data
    ------  ----------
    111     12/12/2008
    222     25/11/2008
    333     10/12/2008

    Desde já, agradeço

     

    Olintho S. de Jesus

    segunda-feira, 15 de dezembro de 2008 12:58

Respostas

  • Anderson,

     

    Só fiz um ajuste colocando o Max na subquery e funcionou.

     

    Grato, valeu pela força.

     

    Olintho S. de Jesus

     

    Select

    Produtos.CodProduto,

    Produtos.Descricao,

    Produtos.CustoUnitario,

    (Select

    PrecoUnitario

    From

    ComprasDetalhes

    Where

    CodProduto = Produtos.CodProduto And DataComputador = Max(Compras.DataComputador) ) As PrecoUnitario,

    Max(Compras.DataComputador) As DataComputador

    From

    Produtos

    Left Outer Join

    ComprasDetalhes As Compras On Produtos.idNumerador = Compras.idProduto

    Group By Produtos.CodProduto, Produtos.Descricao, Produtos.CustoUnitario

     

     

    segunda-feira, 15 de dezembro de 2008 15:33
  • vê se assim funciona:

    Select
    Produtos.CodProduto,
    Produtos.Descricao,
    Produtos.CustoUnitario,
    (Select PrecoUnitario From ComprasDetalhes Where CodProduto = Produtos.CodProduto And DataComputador = Compras.DataComputador) As PrecoUnitario,
    Max(Compras.DataComputador) As DATA
    From
    Produtos
    Left Outer Join ComprasDetalhes As Compras On Produtos.idNumerador = Compras.idProduto
    Group By Produtos.CodProduto, Produtos.Descricao, Produtos.CustoUnitario
    segunda-feira, 15 de dezembro de 2008 14:16

Todas as Respostas

  • cara, tenta assim... fiz um teste com tabelas temporarias, é só tu substituir no select pelas tuas tabelas...

    Create Table #PROD(IDNUMERADOR int, CODIGO varchar(10))

    Insert Into #PROD(IDNUMERADOR, CODIGO) Values(1, '111')
    Insert Into #PROD(IDNUMERADOR, CODIGO) Values(2, '222')
    Insert Into #PROD(IDNUMERADOR, CODIGO) Values(3, '333')

    Create Table #COMP(IDNUMERADOR int, IDPRODUTO int, DATA datetime)

    Insert Into #COMP(IDNUMERADOR, IDPRODUTO, DATA) Values(1, 1, '01/12/2008')
    Insert Into #COMP(IDNUMERADOR, IDPRODUTO, DATA) Values(2, 1, '12/12/2008')
    Insert Into #COMP(IDNUMERADOR, IDPRODUTO, DATA) Values(3, 2, '01/11/2008')
    Insert Into #COMP(IDNUMERADOR, IDPRODUTO, DATA) Values(4, 2, '25/11/2008')
    Insert Into #COMP(IDNUMERADOR, IDPRODUTO, DATA) Values(5, 3, '10/12/2008')

    Select CODIGO, Max(DATA) As DATA From #PROD Left Outer Join #COMP On #PROD.IDNUMERADOR = #COMP. IDPRODUTO Group By CODIGO
    segunda-feira, 15 de dezembro de 2008 13:16
  • no caso do teu exemplo, ficaria:

    Select CODIGO, Max(DATA) As DATA From Produtos Left Outer Join Compras On Produtos.IDNUMERADOR = Compras.IDPRODUTO Group By CODIGO

    algo assim
    segunda-feira, 15 de dezembro de 2008 13:19
  • Anderson,

     

    Somente com as duas colunas funciona beleza, mas como eu tenho mais colunas para selecionar, a query retorna um erro.

     

    "Column 'Produtos.Descricao' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."

     

    O meu SELECT completo é assim:

     

    Select

    Produtos.CodProduto,

    Produtos.Descricao,

    Produtos.CustoUnitario,

    ComprasDetalhes.PrecoUnitario,

    Max(ComprasDetalhes.DataComputador) As DATA

    From

    Produtos

    Left Outer Join ComprasDetalhes On Produtos.idNumerador = ComprasDetalhes.idProduto

    Group By Produtos.CodProduto

     

    segunda-feira, 15 de dezembro de 2008 13:37
  • nesse caso, é só incluir o restante dos campos no group by... ficaria assim:

    Select
    Produtos.CodProduto,
    Produtos.Descricao,
    Produtos.CustoUnitario,
    ComprasDetalhes.PrecoUnitario,
    Max(ComprasDetalhes.DataComputador) As DATA
    From
    Produtos
    Left Outer Join ComprasDetalhes On Produtos.idNumerador = ComprasDetalhes.idProduto
    Group By Produtos.CodProduto, Produtos.Descricao, Produtos.CustoUnitario, ComprasDetalhes.PrecoUnitario
    segunda-feira, 15 de dezembro de 2008 13:39
  •  

    Se eu agrupo por

     

    ComprasDetalhes.PrecoUnitario

     

    a consulta me retorna mais de uma linha, mas eu preciso apenas do ComprasDetalhes.PrecoUnitario referente a data mais recente "Max(ComprasDetalhes.DataComputador)", ou seja, que me mostre o preço referente a ultima compra.

     

    segunda-feira, 15 de dezembro de 2008 14:08
  • vê se assim funciona:

    Select
    Produtos.CodProduto,
    Produtos.Descricao,
    Produtos.CustoUnitario,
    (Select PrecoUnitario From ComprasDetalhes Where CodProduto = Produtos.CodProduto And DataComputador = Compras.DataComputador) As PrecoUnitario,
    Max(Compras.DataComputador) As DATA
    From
    Produtos
    Left Outer Join ComprasDetalhes As Compras On Produtos.idNumerador = Compras.idProduto
    Group By Produtos.CodProduto, Produtos.Descricao, Produtos.CustoUnitario
    segunda-feira, 15 de dezembro de 2008 14:16
  • Anderson,

     

    Só fiz um ajuste colocando o Max na subquery e funcionou.

     

    Grato, valeu pela força.

     

    Olintho S. de Jesus

     

    Select

    Produtos.CodProduto,

    Produtos.Descricao,

    Produtos.CustoUnitario,

    (Select

    PrecoUnitario

    From

    ComprasDetalhes

    Where

    CodProduto = Produtos.CodProduto And DataComputador = Max(Compras.DataComputador) ) As PrecoUnitario,

    Max(Compras.DataComputador) As DataComputador

    From

    Produtos

    Left Outer Join

    ComprasDetalhes As Compras On Produtos.idNumerador = Compras.idProduto

    Group By Produtos.CodProduto, Produtos.Descricao, Produtos.CustoUnitario

     

     

    segunda-feira, 15 de dezembro de 2008 15:33
  • Não seria mais fácil fazer assim?

    SELECT Produtos.CodProduto,
                  Produtos.Descricao,
                  Produtos.CustoUnitario,
                  MAX(PrecoUnitario)          AS PrecoUnitario,
                  MAX(Compras.DataComputador) AS DataComputador
       FROM Produtos
       INNER JOIN ComprasDetalhes AS Compras
            ON Produtos.idNumerador = Compras.idProduto
     GROUP BY Produtos.CodProduto,
                       Produtos.Descricao,
                       Produtos.CustoUnitario
    segunda-feira, 15 de dezembro de 2008 16:47
  • Fabiano,

     

    Neste caso não, pois estaria me retornando o maior PrecoUnitario, sendo que eu quero o PrecoUnitario referente a linha da Data mais recente.

     

    segunda-feira, 15 de dezembro de 2008 17:02