none
Ordenação por data em hierarquia RRS feed

  • Pergunta

  • Boa noite,

    Venho junto de voces pedir humildemente ajuda, porque não estou a ser capaz de fazer o order by conforme desejo.

    Esta é a minha tabela Movimento (Regista movimentos de despesas), sendo esta uma tabela que também tem a possibilidade de registar sub-movimentos, e nesses casos quando é o registo de um sub-movimento a coluna "MOVIMENTOPAI_ID" tem o Id do movimento Pai.

    MOVIMENTO
    ID PK
    MOVIMENTOPAI_ID FK [MOVIMENTO.ID]
    DESCRICAO
    DATA

    O meu objectivo é construir uma query, que retorne uma lista de movimentos pai ordenados pelo campo "CreationDate" e os movimentos filhos por baixo dos movimentos pai. Por exemplo:


    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

    Os Movimentos pai estão ordenados pela data (a negrito) e a vermelho, estão os movimentos filhos que ignoram a ordenação da data mas que se devem manter listados por baixo dos movimentos pais.

    Alguém pode dar uma ajuda por favor?

    Obrigado por toda atenção



    quinta-feira, 16 de novembro de 2017 18:52

Respostas

  • Antônio,

    Estamos falando de auto-relacionamento ou hierarquia?

    Talvez este exemplo que eu tenho aqui sobre hierarquia de cargos com uso de CTE poderá te ajudar:

    CREATE TABLE tblCli (Codigo INT, Nome VARCHAR(40), CodigoSup INT)
    
     
    
    INSERT INTO tblCli VALUES (1,'Presidente', NULL)
    
    INSERT INTO tblCli VALUES (2,'Superintendente', 1)
    
    INSERT INTO tblCli VALUES (3,'Gerente', 2)
    
    INSERT INTO tblCli VALUES (4,'Coordenador', 3)
    
    INSERT INTO tblCli VALUES (5,'Supervisor', 4)
    
    INSERT INTO tblCli VALUES (6,'Analista', 5)
    
    INSERT INTO tblCli VALUES (7,'Estagiário', 6)
    
    INSERT INTO tblCli VALUES (8,'Conselheiro', 1)
    
     
    
    WITH Rel
    
    AS (
    
    SELECT Nome, 1 AS Nivel, Codigo FROM tblCli
    
    WHERE CodigoSup IS NULL
    
    UNION ALL
    
    SELECT tblCli.Nome, Nivel + 1, tblCli.Codigo FROM Rel
    
    INNER JOIN tblCli ON Rel.Codigo = tblCli.CodigoSup
    
    )
    
     
    
    SELECT
    
    REPLICATE('--',Nivel) + '> ' + Nome
    
    FROM
    
    Rel
    
    ORDER BY
    
    Nivel
    


    Pedro Antonio Galvao Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 17 de novembro de 2017 11:18
  • Deleted
    quinta-feira, 16 de novembro de 2017 21:19

Todas as Respostas

  • O Fabricio Catae escreveu um artigo sobre isto. 

    Query Recursiva

    Veja se resolve.


    Danilo Oliveira www.coffeeandcodes.com.br

    quinta-feira, 16 de novembro de 2017 20:10
  • Deleted
    quinta-feira, 16 de novembro de 2017 21:19
  • Antonio,

    É apenas um detalhe na tua ordenação, mas é bem simples, veja um exemplo:

    select ID, MOVIMENTOPAI_ID, DESCRICAO, DATA
    from MOVIMENTO
    order by ISNULL(MOVIMENTOPAI_ID, ID), MOVIMENTOPAI_ID, DATA
    Att,


    Antero Marques
    _____________________________________________________________________________
    Se a resposta for útil, marque como útil, se respondeu totalmente sua dúvida, marque como resposta. O Fórum MSDN é utilizado também como base de conhecimento, então é responsabilidade de todos mantê-lo organizado e funcional.







    quinta-feira, 16 de novembro de 2017 21:29
  • Antônio,

    Estamos falando de auto-relacionamento ou hierarquia?

    Talvez este exemplo que eu tenho aqui sobre hierarquia de cargos com uso de CTE poderá te ajudar:

    CREATE TABLE tblCli (Codigo INT, Nome VARCHAR(40), CodigoSup INT)
    
     
    
    INSERT INTO tblCli VALUES (1,'Presidente', NULL)
    
    INSERT INTO tblCli VALUES (2,'Superintendente', 1)
    
    INSERT INTO tblCli VALUES (3,'Gerente', 2)
    
    INSERT INTO tblCli VALUES (4,'Coordenador', 3)
    
    INSERT INTO tblCli VALUES (5,'Supervisor', 4)
    
    INSERT INTO tblCli VALUES (6,'Analista', 5)
    
    INSERT INTO tblCli VALUES (7,'Estagiário', 6)
    
    INSERT INTO tblCli VALUES (8,'Conselheiro', 1)
    
     
    
    WITH Rel
    
    AS (
    
    SELECT Nome, 1 AS Nivel, Codigo FROM tblCli
    
    WHERE CodigoSup IS NULL
    
    UNION ALL
    
    SELECT tblCli.Nome, Nivel + 1, tblCli.Codigo FROM Rel
    
    INNER JOIN tblCli ON Rel.Codigo = tblCli.CodigoSup
    
    )
    
     
    
    SELECT
    
    REPLICATE('--',Nivel) + '> ' + Nome
    
    FROM
    
    Rel
    
    ORDER BY
    
    Nivel
    


    Pedro Antonio Galvao Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 17 de novembro de 2017 11:18
  • Bom dia,

    Por falta de retorno essa thread está encerrada.

    Se necessário, favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 27 de novembro de 2017 12:21
    Moderador