Buscar os 5 maiores valores de cada venda.

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
reneanarcizo
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 11 Mar 2010 2:36 pm
Localização: Campinas - SP
Renê Narcizo

Boa tarde.

Não faço ideia de como resolver a seguinte questão:

Possuo uma tabela com vendas realizadas, onde possuo N produtos em cada venda, e preciso buscar os maiores valores de cada venda (limitado a 5).

Na tabela abaixo, está um exemplo fictício de como são meus registros:

Selecionar tudo

TABELA DE VENDAS			
COD_VENDA	DATA	        ITEM	             VALOR
1216794172	10/05/2012	CAMISA	     10,00
1216794172	10/05/2012	CAMISA	     10,00
1216794172	10/05/2012	BOLA	             25,00
1216794172	10/05/2012	TENIS	     40,00
1216794172	10/05/2012	TENIS	     40,00
1216794172	10/05/2012	TENIS	     40,00
1216794172	10/05/2012	MEIA	               5,00
1216794520	15/05/2012	CAMISA	     11,00
1216794520	15/05/2012	CAMISA	     11,00
1216794520	15/05/2012	MEIA	               5,00
1216794520	15/05/2012	MEIA	               5,00
1217318846	26/06/2012	CAMISA	     10,00
1217318846	26/06/2012	BOLA	             27,00
1217318846	26/06/2012	BOLA	             27,00
1217318846	26/06/2012	BOLA	             27,00
1217318846	26/06/2012	TENIS	     41,00
1217318846	26/06/2012	TENIS	     41,00
1217318846	26/06/2012	TENIS	     41,00
1217318846	26/06/2012	TENIS	     41,00

Já na seguinte, segue o resultado que desejo:

Selecionar tudo

TABELA DE RESULTADOS			
COD_VENDA	DATA	        ITEM	             VALOR
1216794172	10/05/2012	CAMISA	     10,00
1216794172	10/05/2012	BOLA	             25,00
1216794172	10/05/2012	TENIS	     40,00
1216794172	10/05/2012	TENIS	     40,00
1216794172	10/05/2012	TENIS	     40,00
1216794520	15/05/2012	CAMISA	     11,00
1216794520	15/05/2012	CAMISA	     11,00
1216794520	15/05/2012	MEIA	               5,00
1216794520	15/05/2012	MEIA	               5,00
1217318846	26/06/2012	BOLA	             27,00
1217318846	26/06/2012	BOLA	             27,00
1217318846	26/06/2012	TENIS	     41,00
1217318846	26/06/2012	TENIS	     41,00
1217318846	26/06/2012	TENIS	     41,00
1217318846	26/06/2012	TENIS	     41,00
Me perdoem não postar sequer um código, mas sinceramente não sei nem por onde começar.

Agradeço qualquer ajuda.

[]'s

Renê.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Pode usar funções analíticas pra "numerar" as linhas, e depois, basta filtrar pegando as que são <= 5.
Veja esse documento:
https://glufke.net/oracle/download/funco ... TICAS.html

No seu caso, eu faria algo assim:

Selecionar tudo

SELECT 
  COD_VENDA	
, DATA	
, ITEM	
, VALOR
, ROW_NUMBER()
    OVER (PARTITION BY cod_venda
          ORDER BY valor DESC) "Seq"
FROM TABELA
Essa query vai retornar um campo chamado SEQ, com o número de 1 a N. (Sendo 1, o maior valor para COD_VENDA, 2 o segundo maior, etc)

Veja se funciona!
:-o
reneanarcizo
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 11 Mar 2010 2:36 pm
Localização: Campinas - SP
Renê Narcizo

Vlw a ajuda dr_gori, mas fiz de uma outra maneira (relativamente Lusa, mas funcionou).

Criei 5 FUNCTIONS semelhantes que fazem a busca dos itens de posição de 1 a 5:

Selecionar tudo

create or replace function FNC_GET_MAIOR_1 (p_Cod_Venda in varchar)
                   return varchar is Result varchar2(150);
begin
  SELECT AA.COD_VENDA INTO Result
  FROM (SELECT ROWNUM POSICAO, A.COD_VENDA, A.ITEM
        FROM (SELECT A1.COD_VENDA,
                     A1.ITEM,
                     A1.VALOR
              FROM VENDAS A1
              WHERE A1.COD_VENDA = p_Cod_Venda
              ORDER BY A1.VALOR DESC) A) AA
  WHERE POSICAO = 1;
  return(Result);
end FNC_GET_MAIOR_1;
depois, no meu select eu coloquei no WHERE um comparativo com tais funções:

Selecionar tudo

...
WHERE A.COD_VENDA IN FNC_GET_MAIOR_1(A.COD_VENDA)
OR    A.COD_VENDA IN FNC_GET_MAIOR_2(A.COD_VENDA)
OR    A.COD_VENDA IN FNC_GET_MAIOR_3(A.COD_VENDA)
OR    A.COD_VENDA IN FNC_GET_MAIOR_4(A.COD_VENDA)
OR    A.COD_VENDA IN FNC_GET_MAIOR_5(A.COD_VENDA)
Como são apenas os 5 maiores, fica "viável" fazer dessa maneira... se fossem os 500 maiores, teria que repensar kkkkk


Mas muito obrigado pela ajuda!!!

[]'s
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 18 visitantes