Criar consulta nível de cargo dentro de período do treinamento

SQL Server

SQL

28/09/2023

Olá,

Criei essa consulta para listar todos os colaboradores que realizaram algum curso em um determinado período, porém temos situações que o colaborador é promovido de cargos e na minha consulta abaixo está considerando o ultimo cargo, preciso considerar o cargo que o colaborador estava no dia de realização do curso.
SELECT
C.Descricao,
T.DtInicioProgramacao,
P.NomeUsual,
cl.Codigo,
vCHC.Cargo,
cc.Descricao,
vCHC.DtInicioCargo,
ccc.Data,

T.DtFimProgramacao,
case WHEN
TP.TipoParticipante = 'A' THEN 'Aluno'
ELSE 'Instrutor' END Tipo_Participante,
TP.CargaHoraria,
ISNULL(T.CustoCurso,0)as Custo_Curso


FROM TreinamentoParticipante TP

inner JOIN Treinamento T
ON T.OIDDocumento = TP.OIDDocumento
INNER JOIN Curso C
ON C.OIDDocumento = T.OIDCurso
INNER JOIN Colaborador CL
ON CL.OIDColaborador = TP.OIDColaborador
INNER JOIN Pessoa P
ON CL.OIDPessoa = p.OIDPessoa
INNER JOIN IndicativoSituacao S
ON CL.OIDIndicativoSituacao= S.OIDIndicativoSituacao
INNER JOIN vColaboradorHistoricoCargoLotacao vCHC
ON tp.OIDPessoa = vCHC.OIDPessoa
INNER JOIN ColaboradorCentroCusto CCC
ON CCC.OIDColaborador = TP.OIDColaborador
INNER JOIN CentroCusto CC
ON CC.OIDCentroCusto=CCC.OIDCentroCusto
WHERE CL.Codigo = '08000' AND vCHC.DtInicioCargo = (SELECT max (DtInicioCargo) FROM vColaboradorHistoricoCargoLotacao WHERE Codigo = CL.Codigo) AND CCC.Data = (SELECT max(Data) FROM ColaboradorCentroCusto WHERE CCC.OIDColaborador=OIDColaborador)

O resultado da consulta acima ficou conforme abaixo:
O colaborador Anacleto codigo 08000 recebeu uma promoção no dia 01/08 para o cargo de analista de dados, o cargo anteriro era Analista de Escala promivido em 01/04/2013 preciso que seja apresentado esse cargo na consulta.

Descricao DtInicioProgramacao NomeUsual Codigo Cargo Descricao1 DtInicioCargo Data DtFimProgramacao Tipo_Participante CargaHoraria Custo_Curso
Brigada de Emergência 28/06/2023 00:00:00 Anacleto 08000 Analista de Dados - Analista de Dados Planejamento e Controle Operacional 01/08/2023 00:00:00 01/12/2013 00:00:00 28/06/2023 00:00:00 Aluno 0,417 'R$' 0,00
Brigada de Emergência 19/06/2023 00:00:00 Anacleto 08000 Analista de Dados - Analista de Dados Planejamento e Controle Operacional 01/08/2023 00:00:00 01/12/2013 00:00:00 19/06/2023 00:00:00 Aluno 1,0 'R$' 0,00
Brigada de Emergência 16/08/2023 00:00:00 Anacleto 08000 Analista de Dados - Analista de Dados Planejamento e Controle Operacional 01/08/2023 00:00:00 01/12/2013 00:00:00 16/08/2023 00:00:00 Aluno 1,0 'R$' 0,00
Brigada de Emergência 13/09/2023 00:00:00 Anacleto 08000 Analista de Dados - Analista de Dados Planejamento e Controle Operacional 01/08/2023 00:00:00 01/12/2013 00:00:00 13/09/2023 00:00:00 Aluno 1,0 'R$' 0,00
Brigada de Emergência 12/07/2023 00:00:00 Anacleto 08000 Analista de Dados - Analista de Dados Planejamento e Controle Operacional 01/08/2023 00:00:00 01/12/2013 00:00:00 12/07/2023 00:00:00 Aluno 1,0 'R$' 0,00
Adriano Anacleto

Adriano Anacleto

Curtidas 0

Respostas

Arthur Heinrich

Arthur Heinrich

28/09/2023

Eu imagino que a sua view vColaboradorHistoricoCargoLotacao contenha a data de início de cada um dos cargos, sendo a maior data, a mudança para o cargo atual, vigente até agora.

O primeiro passo, é transformar o resultado dessa view, que contém a data de início, para um resultado que contenha início e fim de vigência de cada cargo.

select
  codigo,
  DtInicioCargo,
  coalesce( lead(DtInicioCargo) over(partition by codigo order by DtInicioCargo), getdate() ) DtFimCargo,
  cargo
from vColaboradorHistoricoCargoLotacao


Feito isso, você faz o join com o resultado dessa subquery:

with
  vCHC as
   (select
      Codigo,
      DtInicioCargo,
      coalesce( lead(DtInicioCargo) over(partition by Codigo order by DtInicioCargo), getdate() ) DtFimCargo,
      Cargo
    from vColaboradorHistoricoCargoLotacao)
select
  ...
from
  ...
  join vCHC on
    vCHC.Codigo = CL.Codigo and
    T.DtInicioProgramacao >= vCHC.DtInicioCargo and
    T.DtInicioProgramacao < vCHC.DtFimCargo
  ...

GOSTEI 0
POSTAR