Busca por maior valor

Oracle

06/05/2016

Bom dia!

Estou tentando criar uma expressão que busque apenas os maiores valores de uma coluna. No exemplo abaixo, poderão perceber que o mesmo produto se repete (Id_Prod) porque houveram entradas destas mercadorias em datas diferentes (Dt_Ent) e o que eu preciso saber é qual o maior valor de entrada (Custo) para cada produto.

A tabela ela aparece assim:

Id_Prod / Dt_Ent / Custo
1 / 04/01/2016 / 1,25
1 / 29/02/2016 / 1,48
1 / 11/01/2016 / 1,71
2 / 07/03/2016 / 1,68
2 / 18/01/2016 / 2,11
2 / 14/03/2016 / 2,54
3 / 25/01/2016 / 3,41
3 / 21/03/2016 / 4,28
3 / 01/02/2016 / 5,15

O resultado desejado é:
Id_Prod / Dt_Ent / Custo
1 / 11/01/2016 / 1,71
2 / 14/03/2016 / 2,54
3 / 01/02/2016 / 5,15

Muito obrigado!
Pedro Junior

Pedro Junior

Curtidas 0

Respostas

Alex Lekao

Alex Lekao

06/05/2016

nao sei se entendi bem.

talves se vc postar o script que ja fez, possamo ajudar melhor.

Mas basicamente, nao sei se funciona com oracle, vc pode utilizar o max().

Caso queira que retorne apenas 3 itens, vc pode utilizar o top 3.

Espero ter ajudado.
GOSTEI 0
Pedro Junior

Pedro Junior

06/05/2016

Bom dia Alex!

Aqui mesmo no fórum é sugerido usar o MAX(), e eu tentei usar a expressão sugerida:

SELECT * FROM FUNCIONARIO WHERE SALARIOFUNCIONARIO = (SELECT MAX(SALARIOFUNCIONARIO) FROM FUNCIONARIO)

Adequei a minha realidade, porém, esta expressão retorna apenas o maior valor.

O que eu preciso que retorne é o maior valor por produto.

Muito Obrigado!!!
GOSTEI 0
Lourival Queiroz

Lourival Queiroz

06/05/2016

Esta função te atende perfeitamente, foi feita para outra solicitação aqui dentro grupo.


select a.data_entrada, a.Item, a.Preco
  from (select data_entrada, Item,  preco,
                     rank() OVER (PARTITION BY Item
                                ORDER BY data_entrada desc) as Ranking
             from nfentrada) a
where a.Ranking = 1
GOSTEI 0
Pedro Junior

Pedro Junior

06/05/2016

Obrigado Lourival!

A expressão ficou:

SELECT CODPROD, CUSGER
FROM (SELECT CODPROD, CUSGER,
RANK() OVER (PARTITION BY CUSGER
ORDER BY CODPROD DESC) AS RANKING
FROM TGFCUS) A
WHERE RANKING = 1
ORDER BY CODPROD

Está retornando várias vezes os mesmos produtos com custos diferentes. Eu gostaria que retornasse apenas uma linha por produto com o valor do maior custo de entrada.

Acredito que seja apenas alguma adequação na expressão que você passou.

Muito obrigado!
GOSTEI 0
Alex Lekao

Alex Lekao

06/05/2016

Bom...

Entao aqui uso sql server, mas acredito que funcione basicamente igual no Oracle.

Tente assim:

select
  campo1, 
  campo2,
  (select 
      max(preco)
   from itemvdaproduto
   where itemvdaproduto.codigo = produto.codigo) as maiorvalor 
from produto


Eu utilizo basicamente assim, nao sei se deu para entender o conceito.
GOSTEI 0
Pedro Junior

Pedro Junior

06/05/2016

Olá!

Se eu testar apenas o subselect ele funciona retornando apenas o maior.

SELECT MAX(Custo.Produto) FROM Custos

Se eu testar o select inteiro ele não funciona.

SELECT
Codigo_Produto,
Custo_Produto,
(SELECT MAX(Custo_Produto)
FROM Custos
WHERE Custos.CodigoProduto = Produtos.Codigo_Produto AS MAIORVALOR
FROM Produtos

Ele retorna
General SQL error.
ORA-00921: fim inesperado do comando SQL.

Obrigado!
GOSTEI 0
Alex Lekao

Alex Lekao

06/05/2016

faltou fechar o parentese no final WHERE Custos.CodigoProduto = Produtos.Codigo_Produto, WHERE Custos.CodigoProduto = Produtos.Codigo_Produto)
GOSTEI 0
Pedro Junior

Pedro Junior

06/05/2016

Olá!

Corrigi a expressão e o resultado não foi positivo. Comecei a desconfiar que pudesse ser algo que não fosse a consulta.

Passei a usar o PL/SQL para fazer a consulta no banco e alterei a expressão para:

select
'custos.codigo_produto',
'custos.custo_entrada',
(select max('custos.custo_entrada')
from 'custos'
where 'custos.codigo.produto' = 'produtos.codigo_produto') as maiorvalor
from 'produtos'

Agora é saber como chamar a tabela, porque eu uso aquele quadrinho que abre para selecionar a tabela e depois na hora do F8 ele dá:
ORA-00903: nome da tabela inválido.

Obrigado!
GOSTEI 0
Alex Lekao

Alex Lekao

06/05/2016

blz.

bom, eu uso sql server, e ja faco uso desta forma a bastante tempo, encontro ultimos custos, ultimas vendas e compras, ultimos fornecedores, etc., alem de maiores valores como eh o seu caso.

so mudo para top 1 e ordeno decrescente ou algo do tipo.

Mas como nao manjo de oracle vou fica devendo alguma ajuda a mais.
GOSTEI 0
Pedro Junior

Pedro Junior

06/05/2016

Gostaria de agradecer a atenção e publicar a expressão que deu certo.

SELECT
CUSTOS.CODIGO_PRODUTO,
MAX(CUSTOS.CUSTO_ENTRADA) AS MAIOR_VALOR
FROM CUSTOS, PRODUTOS
WHERE CUSTOS.CODIGO_PRODUTO = PRODUTOS.CODIGO_PRODUTO
GROUP BY CUSTOS.CODIGO_PRODUTO
ORDER BY PRODUTOS.CODIGO_PRODUTO ASC

Forte abraço para Tadeu Granemann que me ajudou a desvendar este mistério.

[url]https://www.facebook.com/tadeugranemann[/url]

Muito Obrigado!
GOSTEI 0
POSTAR