none
Retornar os não MAX() RRS feed

  • Pergunta

  • Pessoal boa tarde.

    Aqui trabalhamos com SQL Server 2000, estou com dificuldade de montar uma determinada consulta, temos uma tabela que segue a seguinte estrutura com esses campos:

    CD_RELATORIO (inteiro, PK)

    CD_FILIAL (inteiro, onde cada CD_FILIAL pode ter mais de um CD_RELATORIO)

    DATA_BASE (data, onde posso ter mais de um CD_RELATORIO em uma mesma CD_FILIAL com a mesma DATA_BASE).

    VERSAO_RELATORIO (inteiro, onde o maior indica a versão do relatório mais recente quando ocorre em uma CD_FILIAL ter mais de um CD_RELATORIO com mesma DATA_BASE).

    Então, gostaria de elaborar uma consulta que retorne os CD_RELATORIO de CD_FILIAL com mesma DATA_BASE sendo que a VERSAO_RELATORIO deve IS NOT MAX(VERSAO_RELATORIO).

    É isso, não sei se fui claro o suficiente para explanar a minha dúvida.


    quinta-feira, 25 de junho de 2015 18:33

Respostas

  • Experimente essa outra versão, sem a coluna CD_RELATORIO na tabela derivada:

    select
        t.CD_RELATORIO,
        t.CD_FILIAL,
        t.DATA_BASE,
        t.VERSAO_RELATORIO
    from 
    (
        select
            CD_FILIAL,
            DATA_BASE,
            MAX(VERSAO_RELATORIO) AS VERSAO_RELATORIO
        from TABELA
        GROUP BY
            CD_FILIAL,
            DATA_BASE
    ) as m
    inner join TABELA as t
        on 
            t.CD_FILIAL = m.CD_FILIAL and
            t.DATA_BASE = m.DATA_BASE
    where
        t.VERSAO_RELATORIO < m.VERSAO_RELATORIO

    Espero que ajude.


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

    • Marcado como Resposta Marques Junior quinta-feira, 25 de junho de 2015 19:41
    quinta-feira, 25 de junho de 2015 19:27

Todas as Respostas

  • Boa tarde,

    Experimente fazer um teste mais ou menos dessa forma para ver se é obtido o resultado desejado:

    select
        t.CD_RELATORIO,
        t.CD_FILIAL,
        t.DATA_BASE,
        t.VERSAO_RELATORIO
    from 
    (
        select
            CD_RELATORIO,
            CD_FILIAL,
            DATA_BASE,
            MAX(VERSAO_RELATORIO) AS VERSAO_RELATORIO
        from TABELA
        GROUP BY
            CD_RELATORIO,
            CD_FILIAL,
            DATA_BASE
    ) as m
    inner join TABELA as t
        on 
            t.CD_RELATORIO = m.CD_RELATORIO and
            t.CD_FILIAL = m.CD_FILIAL and
            t.DATA_BASE = m.DATA_BASE
    where
        t.VERSAO_RELATORIO < m.VERSAO_RELATORIO

    Espero que ajude.


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

    quinta-feira, 25 de junho de 2015 18:48
  • Deleted
    quinta-feira, 25 de junho de 2015 18:54
  • gapimex, obrigado pelo retorno, porém a consulta não retornou nenhum valor, não que a consulta ficou errada, mas talvez não esclareci melhor o problema.

    José, é a segunda opção, todos exceto o de maior valor (último)

    Abaixo mostro um exemplo, onde essa filial (CD_FILIAL) 20931 tem 9 DATA_BASE iguais, gostaria de retornar todos exceto o CD_RELATORIO 10113 que é a maior versão VERSAO_RELATORIO 9 (maior).

    #|CD_RELATORIO|CD_FILIAL|DATA_BASE|VERSAO_RELATORIO
    -+------------+------+-------------------------+-------------------
    1|10113       |20931 |2010-12-31               |9                  
    2|5139        |20931 |2010-12-31               |1                  
    3|5147        |20931 |2010-12-31               |2                  
    4|5365        |20931 |2010-12-31               |3                  
    5|6769        |20931 |2010-12-31               |4                  
    6|7566        |20931 |2010-12-31               |5                  
    7|8449        |20931 |2010-12-31               |6                  
    8|8579        |20931 |2010-12-31               |7                  
    9|8800        |20931 |2010-12-31               |8                  
    

    quinta-feira, 25 de junho de 2015 19:15
  • Experimente essa outra versão, sem a coluna CD_RELATORIO na tabela derivada:

    select
        t.CD_RELATORIO,
        t.CD_FILIAL,
        t.DATA_BASE,
        t.VERSAO_RELATORIO
    from 
    (
        select
            CD_FILIAL,
            DATA_BASE,
            MAX(VERSAO_RELATORIO) AS VERSAO_RELATORIO
        from TABELA
        GROUP BY
            CD_FILIAL,
            DATA_BASE
    ) as m
    inner join TABELA as t
        on 
            t.CD_FILIAL = m.CD_FILIAL and
            t.DATA_BASE = m.DATA_BASE
    where
        t.VERSAO_RELATORIO < m.VERSAO_RELATORIO

    Espero que ajude.


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

    • Marcado como Resposta Marques Junior quinta-feira, 25 de junho de 2015 19:41
    quinta-feira, 25 de junho de 2015 19:27
  • Deleted
    quinta-feira, 25 de junho de 2015 19:34
  • Obrigado gapimex, fiz uns testes e o retorno é esse mesmo, obrigado mais uma vez. Agradeço a você também José, aqui, acredito que vamos ainda passar um bom tempo com a versão 2000, pois atende perfeitamente nossas necessidades, e já tivemos outros conta tempo (como as pivolt table que nas versão mais recentes são mais simples de montar) mas sempre tem uma solução inteligente para sanar. 
    quinta-feira, 25 de junho de 2015 19:51