none
Ajuda com Query RRS feed

  • Pergunta

  •  

    Boa tarde Pessoal,

     

    Tenho uma tabela que possui produtos com os respectivos valores e a quantidade que foram vendidos.

    Ex:

     

    CODPROD  DT_COMPRA  VALOR  QTD  DESCRICAO

    1                 16/12/2008      18,00     3       SABONETE

    2                 15/12/2008      15,00     2       BOLACHA

    1                 14/12/2008      14,00     1       SABONETE

     

    Preciso criar uma query para agrupar por produto e trazer o último valor do produto, última data de compra, última quantidade comprada e a quantidade total vendida deste produto no periodo filtrado.

     

    O resultado seria:

     

    CODPROD   ULT. DT_COMPRA    ULT.VALOR   ULT. QTD COMPRADA   QTD_TOTAL

    1                 16/12/2008                18,00             3                                    4

    2                 15/12/2008                15,00             2                                    2

     

    Agradeço se puderem me ajudar.

    Obrigado.

    Allex Menezes

     

    terça-feira, 16 de dezembro de 2008 20:52

Respostas

  • Boa Noite,

     

    Segue um exemplo baseado em SQL Server 2000 uma vez que não sei qual SQL Server você está utilizando.

     

    Code Snippet

    DECLARE @Compras TABLE (

    CODPROD INT,

    DT_COMPRA SMALLDATETIME,

    VALOR SMALLMONEY,

    QTD INT,

    DESCRICAO VARCHAR(50))

     

    INSERT INTO @Compras VALUES (1,'20081216',18.00,3,'SABONETE')

    INSERT INTO @Compras VALUES (2,'20081215',15.00,2,'BOLACHA')

    INSERT INTO @Compras VALUES (2,'20081213',14.50,6,'BOLACHA')

    INSERT INTO @Compras VALUES (2,'20081212',13.20,7,'BOLACHA')

    INSERT INTO @Compras VALUES (1,'20081214',14.00,1,'SABONETE')

     

    DECLARE @DataInicio SMALLDATETIME

    DECLARE @DataFim SMALLDATETIME

     

    SET @DataInicio = '20081212'

    SET @DataFim = '20081212'

     

    SELECT C.CODPROD, DESCRICAO, DT_COMPRA AS DT_ULTIMACOMPRA, VALOR AS ULTIMO_VALOR,

    QTD AS ULTIMA_QUANTIDADE FROM @Compras AS C

    INNER JOIN (

    SELECT CODPROD, MAX(DT_COMPRA) AS DT_ULTIMACOMPRA

    FROM @Compras

    GROUP BY CODPROD) AS U ON C.CODPROD = U.CODPROD AND C.DT_COMPRA = U.DT_ULTIMACOMPRA

     

    Particularmente acho a utilização de Subqueries algo meio "poluído". Caso você esteja utilizando o SQL Server 2005 ou superior eu recomendo que você opte por algo mais novo. O recurso de CTE é bem recomendável nesse caso.

     

    Code Snippet

    DECLARE @Compras TABLE (

    CODPROD INT,

    DT_COMPRA SMALLDATETIME,

    VALOR SMALLMONEY,

    QTD INT,

    DESCRICAO VARCHAR(50))

     

    INSERT INTO @Compras VALUES (1,'20081216',18.00,3,'SABONETE')

    INSERT INTO @Compras VALUES (2,'20081215',15.00,2,'BOLACHA')

    INSERT INTO @Compras VALUES (2,'20081213',14.50,6,'BOLACHA')

    INSERT INTO @Compras VALUES (2,'20081212',13.20,7,'BOLACHA')

    INSERT INTO @Compras VALUES (1,'20081214',14.00,1,'SABONETE')

     

    DECLARE @DataInicio SMALLDATETIME

    DECLARE @DataFim SMALLDATETIME

     

    SET @DataInicio = '20081212'

    SET @DataFim = '20081212'

     

    ;WITH UltimaCompra (CODPROD, DT_ULTIMACOMPRA)

    AS (SELECT CODPROD, MAX(DT_COMPRA) AS DT_ULTIMACOMPRA

    FROM @Compras GROUP BY CODPROD)

     

    SELECT C.CODPROD, DESCRICAO, DT_COMPRA AS DT_ULTIMACOMPRA, VALOR AS ULTIMO_VALOR,

    QTD AS ULTIMA_QUANTIDADE FROM @Compras AS C

    INNER JOIN UltimaCompra AS U

    ON C.CODPROD = U.CODPROD AND C.DT_COMPRA = U.DT_ULTIMACOMPRA

     

    Caso queira conhecer mais sobre CTEs, recomendo o link abaixo:

     

    SQL Server 2005 New Features: Common Table Expressions (CTEs)
    http://www.plugmasters.com.br/sys/materias/549/1/SQL-Server-2005-New-Features%3A-Common-Table-Expressions-%28CTEs%29

     

    [ ]s,

     

    Gustavo

    terça-feira, 16 de dezembro de 2008 21:54

Todas as Respostas

  • Boa Noite,

     

    Segue um exemplo baseado em SQL Server 2000 uma vez que não sei qual SQL Server você está utilizando.

     

    Code Snippet

    DECLARE @Compras TABLE (

    CODPROD INT,

    DT_COMPRA SMALLDATETIME,

    VALOR SMALLMONEY,

    QTD INT,

    DESCRICAO VARCHAR(50))

     

    INSERT INTO @Compras VALUES (1,'20081216',18.00,3,'SABONETE')

    INSERT INTO @Compras VALUES (2,'20081215',15.00,2,'BOLACHA')

    INSERT INTO @Compras VALUES (2,'20081213',14.50,6,'BOLACHA')

    INSERT INTO @Compras VALUES (2,'20081212',13.20,7,'BOLACHA')

    INSERT INTO @Compras VALUES (1,'20081214',14.00,1,'SABONETE')

     

    DECLARE @DataInicio SMALLDATETIME

    DECLARE @DataFim SMALLDATETIME

     

    SET @DataInicio = '20081212'

    SET @DataFim = '20081212'

     

    SELECT C.CODPROD, DESCRICAO, DT_COMPRA AS DT_ULTIMACOMPRA, VALOR AS ULTIMO_VALOR,

    QTD AS ULTIMA_QUANTIDADE FROM @Compras AS C

    INNER JOIN (

    SELECT CODPROD, MAX(DT_COMPRA) AS DT_ULTIMACOMPRA

    FROM @Compras

    GROUP BY CODPROD) AS U ON C.CODPROD = U.CODPROD AND C.DT_COMPRA = U.DT_ULTIMACOMPRA

     

    Particularmente acho a utilização de Subqueries algo meio "poluído". Caso você esteja utilizando o SQL Server 2005 ou superior eu recomendo que você opte por algo mais novo. O recurso de CTE é bem recomendável nesse caso.

     

    Code Snippet

    DECLARE @Compras TABLE (

    CODPROD INT,

    DT_COMPRA SMALLDATETIME,

    VALOR SMALLMONEY,

    QTD INT,

    DESCRICAO VARCHAR(50))

     

    INSERT INTO @Compras VALUES (1,'20081216',18.00,3,'SABONETE')

    INSERT INTO @Compras VALUES (2,'20081215',15.00,2,'BOLACHA')

    INSERT INTO @Compras VALUES (2,'20081213',14.50,6,'BOLACHA')

    INSERT INTO @Compras VALUES (2,'20081212',13.20,7,'BOLACHA')

    INSERT INTO @Compras VALUES (1,'20081214',14.00,1,'SABONETE')

     

    DECLARE @DataInicio SMALLDATETIME

    DECLARE @DataFim SMALLDATETIME

     

    SET @DataInicio = '20081212'

    SET @DataFim = '20081212'

     

    ;WITH UltimaCompra (CODPROD, DT_ULTIMACOMPRA)

    AS (SELECT CODPROD, MAX(DT_COMPRA) AS DT_ULTIMACOMPRA

    FROM @Compras GROUP BY CODPROD)

     

    SELECT C.CODPROD, DESCRICAO, DT_COMPRA AS DT_ULTIMACOMPRA, VALOR AS ULTIMO_VALOR,

    QTD AS ULTIMA_QUANTIDADE FROM @Compras AS C

    INNER JOIN UltimaCompra AS U

    ON C.CODPROD = U.CODPROD AND C.DT_COMPRA = U.DT_ULTIMACOMPRA

     

    Caso queira conhecer mais sobre CTEs, recomendo o link abaixo:

     

    SQL Server 2005 New Features: Common Table Expressions (CTEs)
    http://www.plugmasters.com.br/sys/materias/549/1/SQL-Server-2005-New-Features%3A-Common-Table-Expressions-%28CTEs%29

     

    [ ]s,

     

    Gustavo

    terça-feira, 16 de dezembro de 2008 21:54
  • Obrigado Gustavo...

     

    Não havia feito join desta forma ainda...

    Aparentemente era isso que precisava...Vou fazer alguns testes...

     

    Abraços...

    Allex Menezes

     

    quarta-feira, 17 de dezembro de 2008 01:16
  • Boa Noite Allex,

     

    Espero que a solução o atenda.

     

    [ ]s,

     

    Gustavo

    quarta-feira, 17 de dezembro de 2008 01:32