Usuário com melhor resposta
Criar Coluna Dt Fim

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.17Resultado 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 MOMENTOSeria criar coluna Dt Fim e quantidade de dias que ficou em cada seção.
obrigado amigos
Respostas
-
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.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Ronnie Von sexta-feira, 7 de agosto de 2020 19:28
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]
-
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.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Ronnie Von sexta-feira, 7 de agosto de 2020 19:28
-
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.
- Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 10 de agosto de 2020 19:45
-
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]