Usuário com melhor resposta
Ajuda com Query

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
Respostas
-
Boa Noite,
Segue um exemplo baseado em SQL Server 2000 uma vez que não sei qual SQL Server você está utilizando.
Code SnippetDECLARE
@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 SMALLDATETIMEDECLARE
@DataFim SMALLDATETIMESET
@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 CINNER
JOIN (SELECT
CODPROD, MAX(DT_COMPRA) AS DT_ULTIMACOMPRAFROM
@ComprasGROUP
BY CODPROD) AS U ON C.CODPROD = U.CODPROD AND C.DT_COMPRA = U.DT_ULTIMACOMPRAParticularmente 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 SnippetDECLARE
@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 SMALLDATETIMEDECLARE
@DataFim SMALLDATETIMESET
@DataInicio = '20081212'SET
@DataFim = '20081212';
WITH UltimaCompra (CODPROD, DT_ULTIMACOMPRA)AS
(SELECT CODPROD, MAX(DT_COMPRA) AS DT_ULTIMACOMPRAFROM
@Compras GROUP BY CODPROD)SELECT
C.CODPROD, DESCRICAO, DT_COMPRA AS DT_ULTIMACOMPRA, VALOR AS ULTIMO_VALOR,QTD
AS ULTIMA_QUANTIDADE FROM @Compras AS CINNER
JOIN UltimaCompra AS UON
C.CODPROD = U.CODPROD AND C.DT_COMPRA = U.DT_ULTIMACOMPRACaso 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
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 SnippetDECLARE
@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 SMALLDATETIMEDECLARE
@DataFim SMALLDATETIMESET
@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 CINNER
JOIN (SELECT
CODPROD, MAX(DT_COMPRA) AS DT_ULTIMACOMPRAFROM
@ComprasGROUP
BY CODPROD) AS U ON C.CODPROD = U.CODPROD AND C.DT_COMPRA = U.DT_ULTIMACOMPRAParticularmente 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 SnippetDECLARE
@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 SMALLDATETIMEDECLARE
@DataFim SMALLDATETIMESET
@DataInicio = '20081212'SET
@DataFim = '20081212';
WITH UltimaCompra (CODPROD, DT_ULTIMACOMPRA)AS
(SELECT CODPROD, MAX(DT_COMPRA) AS DT_ULTIMACOMPRAFROM
@Compras GROUP BY CODPROD)SELECT
C.CODPROD, DESCRICAO, DT_COMPRA AS DT_ULTIMACOMPRA, VALOR AS ULTIMO_VALOR,QTD
AS ULTIMA_QUANTIDADE FROM @Compras AS CINNER
JOIN UltimaCompra AS UON
C.CODPROD = U.CODPROD AND C.DT_COMPRA = U.DT_ULTIMACOMPRACaso 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
-
-