none
Cosulta Sql 1º preço maior e 2º maior preço de venda do mesmo produto. RRS feed

  • Pergunta

  • Bom dia gostaria uma ajuda pra fazer a seguinte consulta

    Tabela de venda

    VENDA

    IDPRD

    VALOR

    DATA VENDA

    31860

    962

    1600

    2006-08-04 00:00:00.000

    33153

    962

    1600

    2006-09-01 00:00:00.000

    67552

    962

    2051,68

    2007-12-07 00:00:00.000

    68322

    962

    2051,68

    2007-12-07 00:00:00.000

    73820

    962

    2051,68

    2008-01-23 00:00:00.000

    78142

    962

    2051,68

    2008-04-11 00:00:00.000

    95493

    962

    2189,77

    2008-11-20 00:00:00.000

    96365

    962

    2189,77

    2008-11-20 00:00:00.000

     

     

     

    Gostaria de buscar a  venda que teve o maior preço  e o segundo maior preço       de modo que o resultado seria este:

    78142

    962

    2051,68

    2008-04-11 00:00:00.000

    96365

    962

    2189,77

    2008-11-20 00:00:00.000

    quinta-feira, 5 de abril de 2012 12:18

Respostas

  • Bom dia Warlem,

    Veja se o exemplo abaixo te ajuda.

    Simulei o seu caso com os scripts abaixo e cheguei no resultado que você espera.

    veja se te ajuda.

    -- CRIA TABELA
    CREATE TABLE VENDA(
    VENDA	VARCHAR(10),
    IDPRD	INT,
    VALOR	NUMERIC(15,2),
    DATA_DE_VENDA	DATE);
    
    --  INSERE MASSA DE DADOS
    INSERT INTO VENDA VALUES('31860',962,1600,'2006-08-04');
    INSERT INTO VENDA VALUES('33153',962,1600,'2006-09-01');
    INSERT INTO VENDA VALUES('67552',962,2051.68,'2007-12-07');
    INSERT INTO VENDA VALUES('68322',962,2051.68,'2007-12-07');
    INSERT INTO VENDA VALUES('73820',962,2051.68,'2008-01-03');
    INSERT INTO VENDA VALUES('78142',962,2051.68,'2008-04-11');
    INSERT INTO VENDA VALUES('95493',962,2189.77,'2008-11-20');
    INSERT INTO VENDA VALUES('96365',962,2189.77,'2008-11-20');
    
    
    -- CTE PARA SELECT
    WITH CTE_REG_DPL AS(
    SELECT  VENDA,
    		IDPRD,
    		VALOR,
    		DATA_DE_VENDA, 
    		RANK() OVER(ORDER BY VALOR DESC, DATA_DE_VENDA DESC) AS ORDEM 
    FROM VENDA
    )
    
    
    SELECT TOP 2 max(VENDA),IDPRD,VALOR,DATA_DE_VENDA,ORDEM FROM CTE_REG_DPL 
    GROUP BY IDPRD,VALOR,DATA_DE_VENDA,ORDEM
    ORDER BY ORDEM;

    Att,

    Adriano

    • Marcado como Resposta Warlem quinta-feira, 5 de abril de 2012 13:46
    • Não Marcado como Resposta Warlem quinta-feira, 5 de abril de 2012 13:47
    • Marcado como Resposta Warlem quinta-feira, 5 de abril de 2012 13:47
    quinta-feira, 5 de abril de 2012 13:02

Todas as Respostas

  • Acho que seria assim.

    Dessa forma virá os dois primeiros (TOP 2) e os maiores valores MAX()


    SELECT
      TOP 2
      venda,
      idprd,
      max(valor),
      max(data venda)
    FROM tabela
    GROUP BY
      venda,
      idprd
    

    quinta-feira, 5 de abril de 2012 12:26
  • Obrigado Rodrigo por responder tao prontamente.

    mas acho que minha pergunta ficou meio que confusa...

    Eu preciso que a query retorne  o primeiro  e o segundo preço maior das vendas ...

      o TOP nao atende pois o mesmo  traz as primeiras colunas de uma consulta  Ou a ultimas dependendo se vc usar o ASC ou DESC

    quinta-feira, 5 de abril de 2012 12:49
  • Bom dia Warlem,

    Veja se o exemplo abaixo te ajuda.

    Simulei o seu caso com os scripts abaixo e cheguei no resultado que você espera.

    veja se te ajuda.

    -- CRIA TABELA
    CREATE TABLE VENDA(
    VENDA	VARCHAR(10),
    IDPRD	INT,
    VALOR	NUMERIC(15,2),
    DATA_DE_VENDA	DATE);
    
    --  INSERE MASSA DE DADOS
    INSERT INTO VENDA VALUES('31860',962,1600,'2006-08-04');
    INSERT INTO VENDA VALUES('33153',962,1600,'2006-09-01');
    INSERT INTO VENDA VALUES('67552',962,2051.68,'2007-12-07');
    INSERT INTO VENDA VALUES('68322',962,2051.68,'2007-12-07');
    INSERT INTO VENDA VALUES('73820',962,2051.68,'2008-01-03');
    INSERT INTO VENDA VALUES('78142',962,2051.68,'2008-04-11');
    INSERT INTO VENDA VALUES('95493',962,2189.77,'2008-11-20');
    INSERT INTO VENDA VALUES('96365',962,2189.77,'2008-11-20');
    
    
    -- CTE PARA SELECT
    WITH CTE_REG_DPL AS(
    SELECT  VENDA,
    		IDPRD,
    		VALOR,
    		DATA_DE_VENDA, 
    		RANK() OVER(ORDER BY VALOR DESC, DATA_DE_VENDA DESC) AS ORDEM 
    FROM VENDA
    )
    
    
    SELECT TOP 2 max(VENDA),IDPRD,VALOR,DATA_DE_VENDA,ORDEM FROM CTE_REG_DPL 
    GROUP BY IDPRD,VALOR,DATA_DE_VENDA,ORDEM
    ORDER BY ORDEM;

    Att,

    Adriano

    • Marcado como Resposta Warlem quinta-feira, 5 de abril de 2012 13:46
    • Não Marcado como Resposta Warlem quinta-feira, 5 de abril de 2012 13:47
    • Marcado como Resposta Warlem quinta-feira, 5 de abril de 2012 13:47
    quinta-feira, 5 de abril de 2012 13:02
  • Otimo. Adriano atendeu perfeitamente.

    Nao conhecia FUNÇÃO abaixo

    RANK() OVER(ORDER BY VALOR DESC, DATA_DE_VENDA DESC) AS ORDEM 

    Muito interessante. Obrigado.

    quinta-feira, 5 de abril de 2012 13:49