Criar consulta nível de cargo dentro de período do treinamento
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
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
Curtidas 0
Respostas
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.
Feito isso, você faz o join com o resultado dessa subquery:
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