Array
(
)

SQL Server - Select Max

Priscila Cardoso
   - 27 ago 2015

Preciso fazer uma SQL onde eu tenho duas tabelas, uma de produto e uma com a movimentação do custo desses produtos e preciso que me retorne apenas 1 linha para cada produto com o valor do custo da maior data. Exe.
TABELA PRODUTOS TABELA CUSTO RESULTADO
Cod. Descr Cod.Prod. Data Vlr.Custo Cod.Prod. Descr Data Vlr.Custo
1 PRODUTO UM 1 01/01/2015 10,00 1 PRODUTO UM 10/02/2015 30,00
2 PRODUTO DOIS 1 05/01/2015 20,00 2 PRODUTO DOIS 10/02/2015 15,00
3 PODUTO TRES 1 10/02/2015 30,00 3 PRODUTO TRES 0,00
2 10/01/2015 15,00

Alan Mario
   - 27 ago 2015

Em duas tabelas mesmo?

Tentar pegar esse exemplo http://www.devmedia.com.br/forum/select-max-em-mais-de-uma-coluna/12712

Priscila Cardoso
   - 29 ago 2015

Sim, em 2 tabelas. É que no exemplo depois que postei, juntou tudo, mas vou tentar exemplificar novamente:

TABELA PRODUTOS
COD DESCR
1 PRODUTO UM
2 PRODUTO DOIS
3 PRODUTO TRES

TABELA CUSTOS
COD.PROD. DATA CUSTO
1 01/01/2015 10,00
1 10/01/2015 15,00
1 15/02/2015 20,00
2 01/01/2015 50,00

TABELA RESULTADOS
COD.PROD. DATA CUSTO
1 15/02/2015 20,00
2 01/01/2015 50,00
3 0,00

Eu preciso dessa tabela de resultado. Agradeço muito se vc puder me ajudar.

Alan Mario
   - 01 set 2015

É que eu não tentei fazer, mas pelo link que postei te um norte de como fazer?

Randrade
   - 01 set 2015

Você pode utilizar este código para fazer o que deseja. Alterei apenas o nome das colunas.

#Código

Select c.produtoid, c.dt, c.valor
from custo c
inner join 
(SELECT produtoid,MAX(dt) as max_date
FROM custo
WHERE valor > 0
GROUP BY produtoid)a
on a.produtoid = c.produtoid and a.max_date = dt


Neste link você encontrará um exemplo funcional.

Se precisar de explicação do código, avisa que explico aqui.

Alan Mario
   - 01 set 2015

Se não for pedir demais, pedir antecipadamente uma explicação, pode ser da forma mais simples.

Randrade
   - 02 set 2015


Citação:
Se não for pedir demais, pedir antecipadamente uma explicação, pode ser da forma mais simples.


Olá Alan,
posso explica sim. É que ontem eu estava sem tempo, aí postei o código apenas para ajudar a autora da pergunta. Mas vamos lá.

Nesta parte do código, eu seleciono o id do produto e a data máxima do produto onde o valor seja maior que 0 (WHERE valor > 0). Esse select me retorna apenas o produto que tiver a maior data:
#Código

SELECT produtoid,MAX(dt) as max_date
FROM custo
WHERE valor > 0
GROUP BY produtoid

Feito isso, eu faço um Inner Join da tabela custo com o select. Isso me possibilita retornar os dados da tabela custo também.
#Código
use testes
Select c.produtoid, c.dt, c.valor
from custo c
inner join 
(SELECT produtoid,MAX(dt) as max_date
FROM custo
WHERE valor > 0
GROUP BY produtoid)a
on a.produtoid = c.produtoid and a.max_date = dt


Como estou utilizando um Inner Join, ele irá me retornar o custo apenas dos produtos retornados no select acima.

Caso a explicação esteja "um pouco" confusa, me avise que tento simplificar mais.