Usuário com melhor resposta
SELECT DISTINCT com JOIN?

Pergunta
-
Boa noite.
Não consigo fazer um select, estou a dois dias tentando, pesquisando, testando...
É o seguinte, ex.:
Tenho as tabelas, PEDIDOS, VENDEDORES e PRODUTOS.
PRODUTOS ( id , nome )
VENDEDORES ( id , nome )
PEDIDOS ( data, idvendedor, idproduto )
É um exemplo que simula bem o meu caso, sendo que a tabela PEDIDOS tem a PK em idvendedor e data (um vendedor não pode ter dois pedidos na mesma data e horário).
Como eu seleciono o VENDEDOR e o PRODUTO que tenham o último pedido à partir de uma certa data?
Passando a data 01/12/2008 13:00, preciso que retorne por exemplo:
01/12/2008 12:00 João Mouse
01/12/2008 11:50 Pedro Teclado
01/12/2008 12:02 Maria PC
O último pedido de cada vendedor anterior à data X. Como fazer isso?
Se alguém puder ajudar, tenho o código SQL simulando esse caso.
Obrigado,
André Ricardo
=== Editado por andrerm @ 03 dez 2008 9:10 UTC===
Agora que postei que vi o fórum que está? Achei que estava postando em SQL Iniciantes. Como mudar?
Respostas
-
Olá,
Veja se este exemplo também ajuda, desenvolvido para o SQL Server 2005 utilizando CTE e também o 2000, sem o uso do CTE.
Code SnippetCreate
Table Tabela (Id Int, IdProd Int, Custo Float, DataCompra DateTime)Insert
Into Tabela Values(1,5,66.60, GETDATE())Insert
Into Tabela Values(2,5,08.61, GETDATE()-2)Insert
Into Tabela Values(3,5,14.62, GETDATE()-1)Insert
Into Tabela Values(4,8,28.63, GETDATE()+1)Insert
Into Tabela Values(5,8,32.64, GETDATE()+2)Insert
Into Tabela Values(6,8,64.65, GETDATE()+3)Select
* from Tabela;With
SomaData(IdProd, Data)As
( Select IdProd, MAX(DataCompra) from Tabela Group By IdProd )Select
T.Id, S.IdProd, T.Custo, S.Datafrom
Tabela T Inner Join SomaData S On T.DataCompra = S.Data--Sem CTE --
Select
T.Id, S.IdProd, T.Custo, S.Datafrom
Tabela T Inner Join (Select IdProd, MAX(DataCompra) As Data from Tabela Group By IdProd) S On T.DataCompra = S.Data -
Boa tarde,
Obrigado pelas respostas mas nenhum dos dois jeitos deu certo.
Teria que ser algo como o Júnior Galvão postou, mas faltou um detalhe, porque podem ter duas vendas no mesmo horário de vendedores diferentes.
Algo tipo:select
pe
.data,v
.nome,p
.nomefrom
pedidos as pe
inner join (select idvendedor, max(data) as data from pedidos group by idvendedor) as s
on pe.data = s.data AND PE.IDVENDEDOR = S.IDVENDEDOR
join produtos as p on p.idproduto = pe.idproduto
join vendedores as v on v.idvendedor = pe.idvendedor
Estava escrevendo a resposta, e resolvi testar on pe.data = s.data AND PE.IDVENDEDOR = S.IDVENDEDOR. ....e não é que funciona??
Não imaginava que podia usar o AND junto com o ON, deu certo!!!
Muito obrigado.
André Ricardo
Todas as Respostas
-
Bom Dia,
Tente o seguinte:
Code SnippetSELECT
MaiorData, V.Nome AS Vendedor, P.Nome AS ProdutoFROM
Vendedores
AS VINNER
JOIN Pedidos AS Pe ON V.IDVendedor = Pe.IDVendedorINNER
JOIN (SELECT
IDVendedor, MAX(Data) As MaiorData FROM Pedidos GROUP BY IDVendedor) AS MON
Pe.IDVendedor = M.IDVendedor AND Pe.IDVendedor =M.IDVendedorLEFT
OUTER JOIN Produtos AS P ON Pe.IDProduto = P.IDProduto[ ]s,
Gustavo
-
Olá,
Veja se este exemplo também ajuda, desenvolvido para o SQL Server 2005 utilizando CTE e também o 2000, sem o uso do CTE.
Code SnippetCreate
Table Tabela (Id Int, IdProd Int, Custo Float, DataCompra DateTime)Insert
Into Tabela Values(1,5,66.60, GETDATE())Insert
Into Tabela Values(2,5,08.61, GETDATE()-2)Insert
Into Tabela Values(3,5,14.62, GETDATE()-1)Insert
Into Tabela Values(4,8,28.63, GETDATE()+1)Insert
Into Tabela Values(5,8,32.64, GETDATE()+2)Insert
Into Tabela Values(6,8,64.65, GETDATE()+3)Select
* from Tabela;With
SomaData(IdProd, Data)As
( Select IdProd, MAX(DataCompra) from Tabela Group By IdProd )Select
T.Id, S.IdProd, T.Custo, S.Datafrom
Tabela T Inner Join SomaData S On T.DataCompra = S.Data--Sem CTE --
Select
T.Id, S.IdProd, T.Custo, S.Datafrom
Tabela T Inner Join (Select IdProd, MAX(DataCompra) As Data from Tabela Group By IdProd) S On T.DataCompra = S.Data -
Boa tarde,
Obrigado pelas respostas mas nenhum dos dois jeitos deu certo.
Teria que ser algo como o Júnior Galvão postou, mas faltou um detalhe, porque podem ter duas vendas no mesmo horário de vendedores diferentes.
Algo tipo:select
pe
.data,v
.nome,p
.nomefrom
pedidos as pe
inner join (select idvendedor, max(data) as data from pedidos group by idvendedor) as s
on pe.data = s.data AND PE.IDVENDEDOR = S.IDVENDEDOR
join produtos as p on p.idproduto = pe.idproduto
join vendedores as v on v.idvendedor = pe.idvendedor
Estava escrevendo a resposta, e resolvi testar on pe.data = s.data AND PE.IDVENDEDOR = S.IDVENDEDOR. ....e não é que funciona??
Não imaginava que podia usar o AND junto com o ON, deu certo!!!
Muito obrigado.
André Ricardo -