Criar consulta nível de cargo dentro de período do treinamento
28/09/2023
0
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
Curtir tópico
+ 0
Responder
Posts
28/09/2023
Arthur Heinrich
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 ...
Responder
Clique aqui para fazer login e interagir na Comunidade :)