none
Criar Coluna Dt Fim RRS feed

  • Pergunta

  • Amigos boa tarde! estou perdido, tentei por vários dias e nada, eu ate separei a SQL em 2 partes, vamos la, meu funcionário foi transferido  dia 01/04/2019 para seção 01.1.001.1.01 e no dia 01/08/2019 foi transferido 01.1.001.1.17

    Preciso criar uma coluna com data fim que o mesmo ficou em cada seção e prazo de dias

    SQL 

    SELECT 
    PFUNC.CHAPA,
    --PFUNC.NOME,
    CONVERT (VARCHAR(10),PFUNC.DATAADMISSAO,103) AS 'DTADMISSAO',
    CONVERT (VARCHAR(10),PFUNC.DATADEMISSAO,103) AS 'DTDEMISSAO',

    PATUAL.DESCRICAO AS 'SITUAÇÃO ATUAL', 
    PANT.DESCRICAO AS 'SITUAÇÃO NO PERIODO',
    CONVERT (VARCHAR(10),S.DTMUDANCA,103) AS 'DTMUDANCA',
    S.CODSECAO
    /*,
    PFFINANC.ANOCOMP,
    PFFINANC.MESCOMP,
    SUM (PFFINANC.VALOR)*/
    FROM PFUNC  (NOLOCK) LEFT OUTER JOIN 
    PFHSTSIT (NOLOCK) ON (PFUNC.CODCOLIGADA=PFHSTSIT.CODCOLIGADA 
    AND PFUNC.CHAPA=PFHSTSIT.CHAPA) 
    INNER JOIN PCODSITUACAO PATUAL (NOLOCK) ON (PATUAL.CODINTERNO=PFUNC.CODSITUACAO) 
    INNER JOIN PCODSITUACAO PANT (NOLOCK) ON (PANT.CODINTERNO=PFHSTSIT.NOVASITUACAO)
    LEFT  JOIN PFHSTSEC AS S (NOLOCK) ON (S.CODCOLIGADA=PFUNC.CODCOLIGADA AND S.CHAPA=PFUNC.CHAPA)

    --INNER JOIN PFFINANC ON S.CODCOLIGADA = PFFINANC.CODCOLIGADA   AND S.CHAPA = PFFINANC.CHAPA
    --AND   PFFINANC.NROPERIODO IN ('50','60') /* FOLHA PAGAMENTO */

    WHERE DATAMUDANCA =(SELECT MAX(PFH1.DATAMUDANCA)
    FROM PFHSTSIT PFH1
    WHERE PFH1.CODCOLIGADA = PFHSTSIT.CODCOLIGADA
    AND PFH1.CHAPA=PFHSTSIT.CHAPA
    --AND PFH1.DATAMUDANCA = (CASE WHEN MONTH(PFH1.DATAMUDANCA) = 12 THEN '01' ELSE CONVERT (CHAR(2), (MONTH(PFH1.DATAMUDANCA) + 1)) END + /*'/01/'*/ + CASE WHEN MONTH(PFH1.DATAMUDANCA) = 12 THEN CONVERT (CHAR(4), (YEAR(PFH1.DATAMUDANCA)+ 1)) ELSE YEAR(PFH1.DATAMUDANCA) END))
    --AND PFHSTSIT.NOVASITUACAO='A'
    AND PFUNC.CHAPA IN ('008800')
    )
    GROUP BY
    PFUNC.CHAPA,
    PFUNC.NOME,
    PFUNC.DATADEMISSAO,
    PATUAL.DESCRICAO, 
    PANT.DESCRICAO,
    S.DTMUDANCA,
    S.CODSECAO,
    PFUNC.DATAADMISSAO
    --PFFINANC.ANOCOMP,
    --PFFINANC.MESCOMP

    order by DTMUDANCA

    Resultado

    CHAPA DTADMISSAO DTDEMISSAO ATUAL SIT PERIODO DTMUDANCA CODSECAO
    008800 01/04/2019 NULL                 Ativo          Ativo         01/04/2019 01.1.001.1.01
    008800 01/04/2019 NULL                 Ativo           Ativo          01/08/2019 01.1.001.1.17

    Resultado esperado

    CHAPA DTADMISSAO DTDEMISSAO ATUAL SIT PERIODO DTMUDANCA CODSECAO        DTFIM             DIAS
    008800 01/04/2019 NULL                 Ativo          Ativo         01/04/2019 01.1.001.1.01    01/08/2019     ???
    008800 01/04/2019 NULL                 Ativo           Ativo         01/08/2019 01.1.001.1.17    ATE MOMENTO

    Seria criar coluna Dt Fim e quantidade de dias que ficou em cada seção.

    obrigado amigos

    sexta-feira, 7 de agosto de 2020 17:10

Respostas

Todas as Respostas

  • Ronnie,

    Acredito que o você não poderá diretamente no mesmo Select trazer as datas de cada local de trabalho, pois isso poderá gerar duplicidade dos dados, o mais indicado seria usar Subquery ou até mesmo CTE.

    Então eu lhe pergunto, como você consegui identificar para cada usuário as devidas seções que o referido usuário trabalhou?

    Este poderá ser o primeiro passo, montar uma Subquery, VIEW ou CTE que possa lhe trazer estes dados e depois realizamos a junção destes dados.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 7 de agosto de 2020 17:25
  • Boa tarde,

    Ronnie, se você estiver utilizando o SQL Server 2012 ou mais recente, acho que você pode utilizar a função Lead:

    https://docs.microsoft.com/pt-br/sql/t-sql/functions/lead-transact-sql?view=sql-server-ver15

    Você colocaria a sua query original dentro de uma CTE, e na parte seguinte/final você utilizaria a função Lead para obter a data da mudança da linha seguinte e utiliza-la como data final.

    Espero que ajude


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

    • Marcado como Resposta Ronnie Von sexta-feira, 7 de agosto de 2020 19:28
    sexta-feira, 7 de agosto de 2020 17:45
  • Jovem obrigado pela ajuda, conseguimos fiz dessa forma.

      

      LEAD((CONVERT (VARCHAR(10),S.DTMUDANCA,103) ) , 1) OVER  (PARTITION BY PFUNC.CHAPA ORDER BY S.DTMUDANCA) AS DtFIM ,

    Me retornou data FIM, agora vou para 2 parte da SQL.

    Obrigado por enquanto.

    sexta-feira, 7 de agosto de 2020 19:29
  • Ronnie,

    Nesta mesma linha da raciocínio, você pode também testar a função Last_Value():

    Last_Value((CONVERT (VARCHAR(10),S.DTMUDANCA,103) ) , 1) OVER  (PARTITION BY PFUNC.CHAPA ORDER BY S.DTMUDANCA) AS DtFIM ,


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 10 de agosto de 2020 19:47