none
Inserir em tabela existente RRS feed

  • Pergunta

  • Pessoal, bom dia.

    Estou com um problema meio complicado (pelo menos ao meu ver).

    Tenho uma tabela Historico. E tenho duas colunas referente ao inicio e termino da pessoa em um certo cargo. Se a pessoa ainda for funcionario, a ultima linha do historico com o id_funcionario referente a ela deve ser NULL, senao, deve ter data de termino.

    Para isso, criei uma procedure para pegar a ultima linha de cada funcionario que segue abaixo:

    IF OBJECT_ID('dbo.UltimoHistorico', 'U') IS NOT NULL
      DROP TABLE dbo.UltimoHistorico;
    
    with CTE_RN as
    (
        select
            *,
            ROW_NUMBER() OVER(PARTITION BY id_colaborador ORDER BY termino) as RN
        from historico
    )
    
    select 
    id_historico,
    id_cargo,
    id_unidadenegocio,
    id_motivo,
    id_local,
    id_projeto ,
    id_departamento ,
    id_colaborador ,
    salario,
    inicio,
    termino,
    tempocargo,
    ck_coord 
    
    into UltimoHistorico from CTE_RN
    where RN = 1;

    Porém, com essa ordenacao por termino crescente, só da certo para quem ainda é funcionario, pois o NULL vem em primeiro.

    Se eu mudo para decrescente, só da certo para ex-funcionario pois o campo de valor NULL vai para ultimo, ou seja, nao faz o select dele.

    Obrigado desde ja, e sei que está um pouco confuso, mas ta difícil para explicar isso :/


    Leonardo D'Amato

    terça-feira, 11 de novembro de 2014 12:44

Respostas

  • Bom dia,

    Leonardo, experimente utilizar a função IsNull para substituir o Null por uma data distante, passando então a ordenar por ordem decrescente:

            ROW_NUMBER() OVER(PARTITION BY id_colaborador ORDER BY isnull(termino, '20790606') DESC) as RN

    obs: 06/06/2079 é o maior valor para o tipo SmallDateTime; se a sua coluna for de outro tipo (ex: Date, DateTime, etc) você pode substituir por 31/12/9999

    Espero que ajude.


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


    • Editado gapimex terça-feira, 11 de novembro de 2014 12:57
    • Marcado como Resposta Leonardo N. D'Amato terça-feira, 11 de novembro de 2014 16:07
    terça-feira, 11 de novembro de 2014 12:56

Todas as Respostas

  • Se você tem que retornar apenas a última linha para cada funcionário, você pode colocar uma condição pegando o termino IS NULL ou termino  = sub-query com max(termino) do funcionário.

    UPDATE

    Uma coisa que me veio a cabeça agora, uma pessoa nunca terá uma data inicio que esteja em um intervalo inicio-termino já existente, correto? Afinal, você não pode entrar na empresa novamente se você já está nela. Portanto, você poderia ordenar simplesmente pela data de início.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como Útil". Se por um acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    terça-feira, 11 de novembro de 2014 12:54
  • Bom dia,

    Leonardo, experimente utilizar a função IsNull para substituir o Null por uma data distante, passando então a ordenar por ordem decrescente:

            ROW_NUMBER() OVER(PARTITION BY id_colaborador ORDER BY isnull(termino, '20790606') DESC) as RN

    obs: 06/06/2079 é o maior valor para o tipo SmallDateTime; se a sua coluna for de outro tipo (ex: Date, DateTime, etc) você pode substituir por 31/12/9999

    Espero que ajude.


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


    • Editado gapimex terça-feira, 11 de novembro de 2014 12:57
    • Marcado como Resposta Leonardo N. D'Amato terça-feira, 11 de novembro de 2014 16:07
    terça-feira, 11 de novembro de 2014 12:56
  • Deleted
    terça-feira, 11 de novembro de 2014 14:27
  • Deleted
    terça-feira, 11 de novembro de 2014 14:29
  • Perfeito, como sempre.

    Obrigado, gapimex.


    Leonardo D'Amato

    terça-feira, 11 de novembro de 2014 16:07
  • É uma boa ideia, Jose, visto que tenho tido bastantes problemas sempre que devo recuperar dados desta tabela. Não tinha pensado nisso. Vou estudar de fazer esta alteração.

    Obrigado pela força


    Leonardo D'Amato

    terça-feira, 11 de novembro de 2014 16:11