none
Ordenação por data - Relacao registo pai, registo filho RRS feed

  • Pergunta

  • +-----------------+-------------------+
    |    MOVIMENTO    |                   |
    +-----------------+-------------------+
    | ID              | PK                |
    | MOVIMENTOPAI_ID | FK [MOVIMENTO.ID] |
    | DESCRICAO       |                   |
    | DATA            |                   |
    +-----------------+-------------------+
    +----+------------------+------------------------------------------+------------+
    | ID | ParentMovementId |                Descrição                 |    Data    |
    +----+------------------+------------------------------------------+------------+
    |  1 | NULL             | Movimento Pai 1                          | 01-10-2017 |
    |  2 | 1                | Sub movimento 1 filho do Movimento Pai 1 | 02-10-2017 |
    |  3 | 1                | Sub movimento 2 filho do Movimento Pai 1 | 01-01-2017 |
    |  4 | NULL             | Movimento Pai 2                          | 31-09-2017 |
    |  5 | NULL             | Movimento Pai 3                          | 28-07-2017 |
    +----+------------------+------------------------------------------+------------+
    

    Boa noite,

    Com base no apresentado em cima, gostaria de saber como poderei fazer para obter o seguinte resultado:

    - Movimentos Pai (ParentMovementId = NULL) ordenados por Data desc

    - Movimentos Filhos listados por debaixo dos Movimentos Pai (sem ordenação)

    sexta-feira, 8 de dezembro de 2017 17:56

Respostas

Todas as Respostas

  • Boa tarde,

    Experimente fazer uns testes dessa forma:

    select
        m.ID,
        m.MovimentoPai_ID,
        m.Descricao,
        m.Data,
        coalesce(p.Data, m.Data) as DataPai,
        coalesce(m.MovimentoPai_ID, m.ID) as IDPai
    from Movimento as m
    left join Movimento as p
        on p.ID = m.MovimentoPai_ID
    order by
        DataPai desc,
        IDPai

    Espero que ajude


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

    sexta-feira, 8 de dezembro de 2017 18:42
  • Obrigado gapimex, pelos testes que fiz é isso mesmo que eu queria.

    Pode por favor explicar o seu racional ? E o que faz aquele "coalesce" Muito obrigado

    sexta-feira, 8 de dezembro de 2017 20:41
  • Na query foi utilizado o Left Join para fazer uma junção com a própria tabela para obter a data do movimento pai.

    A função Coalesce retorna o primeiro valor não nulo entre as colunas passadas como parâmetro. Nessa query a função foi utilizada para obter a data do movimento pai (p.Data) caso exista ou então a própria data (m.Data), e o ID do movimento pai (m.MovimentoPai_ID) ou o próprio (m.ID).

    No Order By temos a coluna DataPai por ordem descendente e a coluna IDPai para que os movimentos filhos sejam retornados na sequencia.

    Espero que ajude


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

    sexta-feira, 8 de dezembro de 2017 22:11
  • Deleted
    sábado, 9 de dezembro de 2017 13:06