none
Select com MAX e JOIN RRS feed

  • Pergunta

  • Olá à todos!

    Tento criar um select em duas tabelas, ambas tem em comum a coluna Tit_Numero, daí usei um JOIN. A cada movimentação no título, Tit_Numero é repetido e criado a ele um número na coluna MovTit_Titulo, que não se repete, daí usei um MAX para trazer a última movimentação, no caso, o MovTit_Titulo de maior número. Segue abaixo uma exemplicação das duas tabelas:

    -----------------------------------------------------

    [MovTit_a_Receber]

    MovTit_Titulo - Tit_Numero - Total_Pago

    0001               -  0022            -  900,56

    0002               -  0078            -  1.007,5

    0003               -  0123            -  556,90

    0004               -  0022            -  982,56

    ------------------------------------------------------------

    [Titulos_a_Receber]

    Tit_Numero - Tit_Vencimento - Cli_Cod

    0022               -  23/09/2013     -  0098

    0078               -  11/03/2012     -  0088

    0123               -  05/10/2013     -  0055

    0022               -  23/09/2013      -  0098

    ------------------------------------------------------------

    Todavia, ao executar o select, ele repete alguns valores, mas não todos.

    Segue exemplo abaixo, que no caso, deveria trazer apenas a linha de valor 982,56, pois tem MovTit_Titulo maior, mas traz outro valor também:

    MovTit_Titulo - Tit_Numero - Tit_Vencimento - Cli_Cod - Total_Pago
    0001               -   0022           -  23/09/2013        -  0098     -  900,56

    0004               -   0022           -  23/09/2013        -  0098     -  982,56

    O código é o seguinte:

    USE dbdsctreino
    SELECT MAX(MovTit_Numero), t.Tit_Numero, Cli_Cod, Tit_DataVencimento, ElementoPreco_Cod, Par_SerieNumero, Tit_ValorPrincipal, 
    MovTit_TotalPago, Tit_Situacao,Tit_DataPagamento
    FROM Titulos_a_Receber t JOIN Movimento_Titulos_AReceber p
    ON t.Tit_Numero=p.Tit_Numero
    WHERE Tit_DataEmissao > '2012-12-31 00:00:00.000' and MovTit_Cancelado = 'N'
    and Cli_Cod ='0444'
    GROUP BY Cli_Cod, t.Tit_Numero, Tit_DataVencimento, ElementoPreco_Cod, Par_SerieNumero, Tit_ValorPrincipal, 
    MovTit_TotalPago, Tit_Situacao,Tit_DataPagamento
    ORDER BY Cli_Cod


    sábado, 5 de outubro de 2013 21:21

Respostas

  • Boa noite,

    Experimente dessa forma:

    with CTE_RN as
    (
        SELECT 
            MovTit_Numero, 
            t.Tit_Numero, 
            Cli_Cod, 
            Tit_DataVencimento, 
            ElementoPreco_Cod, 
            Par_SerieNumero, 
            Tit_ValorPrincipal, 
            MovTit_TotalPago, 
            Tit_Situacao,
            Tit_DataPagamento,
            ROW_NUMBER() OVER(PARTITION BY t.Tit_Numero ORDER BY MovTit_Numero DESC) as RN
        FROM Titulos_a_Receber t 
        JOIN Movimento_Titulos_AReceber p
            ON t.Tit_Numero = p.Tit_Numero
        WHERE 
            Tit_DataEmissao > '2012-12-31 00:00:00.000' and 
            MovTit_Cancelado = 'N' and 
            Cli_Cod ='0444'
    )
    
    select * from CTE_RN
    where RN = 1
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    domingo, 6 de outubro de 2013 00:42
  • Deleted
    domingo, 6 de outubro de 2013 01:21

Todas as Respostas

  • Exemplo:

    Tem a tabela acima com dos dados referentes logo abaixo!

    Eu quero o Codigo "Máximo" utilizo essa SQL

    SELECT top 1 max(Codigo) as CodigoMaximo
          , ID
          ,[Valores]
      FROM [App].[dbo].[TabelaMax] 
      group by ID, VALORES
      order by max(Codigo) desc
    Adaptar ao vosso !!!


    Fúlvio Cezar Canducci Dias

    domingo, 6 de outubro de 2013 00:18
  • Boa noite,

    Experimente dessa forma:

    with CTE_RN as
    (
        SELECT 
            MovTit_Numero, 
            t.Tit_Numero, 
            Cli_Cod, 
            Tit_DataVencimento, 
            ElementoPreco_Cod, 
            Par_SerieNumero, 
            Tit_ValorPrincipal, 
            MovTit_TotalPago, 
            Tit_Situacao,
            Tit_DataPagamento,
            ROW_NUMBER() OVER(PARTITION BY t.Tit_Numero ORDER BY MovTit_Numero DESC) as RN
        FROM Titulos_a_Receber t 
        JOIN Movimento_Titulos_AReceber p
            ON t.Tit_Numero = p.Tit_Numero
        WHERE 
            Tit_DataEmissao > '2012-12-31 00:00:00.000' and 
            MovTit_Cancelado = 'N' and 
            Cli_Cod ='0444'
    )
    
    select * from CTE_RN
    where RN = 1
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    domingo, 6 de outubro de 2013 00:42
  • Deleted
    domingo, 6 de outubro de 2013 01:21
  • José.Diz, rodou perfeitamente, e deu para entender perfeitamente também.

    Obrigado!


    domingo, 6 de outubro de 2013 01:34
  • Gapimex, ajudou sim, rodou também perfeitamente. Nunca tinha usado OVER, daí não entendi muito bem o código. Vou estudá-lo mais profundamente para aprender.

    Obrigado!

    domingo, 6 de outubro de 2013 01:37