Fórum Buscar o Penultimo registro em apenas alguns campos da consulta SQL #478772
13/05/2014
0
Bom dia,
gostaria de uma ajuda para conseguir desvendar esta SQL que está dificil!!! rsrs
Estou montando um relatório onde preciso buscar o campo do Ultimo e Penultimo Salário, Ultima Função e Penultima Função, ou seja, vou ter 2 campos na Consulta que vão buscar as penultimas informações.
Consegui montar a SQL para buscar estas informações de um funcionário.... Mas o problema é que com Sub-select não estou conseguindo buscar vários campos neste....
Vejam abaixo até onde cheguei, sendo que desta maneira trás todas as informações que desejo, mas de apenas um funcionários.... preciso de acertar esta sql para que tragam todos os funcionários:
SELECT PFUNC.CHAPA, PFUNC.NOME, PFUNC.DATAADMISSAO, (SELECT DTMUDANCA FROM PFHSTFCO WHERE CODCOLIGADA=32 AND MOTIVO='01' AND CHAPA=0020122)AS DATAULTPROMO,
PFUNC.SALARIO,PCARGO.NOME,PSECAO.DESCRICAO,
(SELECT TOP 1
PFUNCAO.NOME
FROM
PFHSTFCO A
JOIN PFHSTFCO B ON A.CHAPA = B.CHAPA AND A.CODCOLIGADA = B.CODCOLIGADA AND A.DTMUDANCA > B.DTMUDANCA
JOIN PFUNCAO(NOLOCK) ON PFUNCAO.CODIGO=B.CODFUNCAO
WHERE A.CHAPA = '0020122'
ORDER BY A.DTMUDANCA DESC, B.DTMUDANCA DESC) AS FUNC_ANTES,
PFUNCAO.NOME AS FUNC_ATUAL,
(SELECT TOP 1
B.SALARIO
FROM
PFHSTSAL A
JOIN PFHSTSAL B ON A.CHAPA = B.CHAPA AND A.CODCOLIGADA = B.CODCOLIGADA AND A.DTMUDANCA > B.DTMUDANCA
WHERE A.CHAPA = '0020122'
ORDER BY A.DTMUDANCA DESC, B.DTMUDANCA DESC) AS SAL_ANTERIOR
FROM PFUNC(NOLOCK) LEFT
JOIN PSECAO(NOLOCK) ON PFUNC.CODSECAO=PSECAO.CODIGO
JOIN PFUNCAO(NOLOCK) ON PFUNC.CODFUNCAO=PFUNCAO.CODIGO AND PSECAO.CODCOLIGADA=PFUNCAO.CODCOLIGADA
JOIN PFHSTFCO(NOLOCK) ON PFUNCAO.CODIGO=PFHSTFCO.CODFUNCAO AND PFUNC.CODCOLIGADA=PFHSTFCO.CODCOLIGADA AND PFUNC.CHAPA=PFHSTFCO.CHAPA
JOIN PCARGO(NOLOCK) ON PFUNC.CODCOLIGADA=PCARGO.CODCOLIGADA AND PCARGO.CODIGO=PFUNCAO.CARGO
WHERE PFUNC.CODCOLIGADA=32 AND PFHSTFCO.CHAPA<>'0'
GROUP BY PFUNC.CHAPA, PFUNC.NOME, PFUNC.DATAADMISSAO, PFUNC.SALARIO,PCARGO.NOME,PSECAO.DESCRICAO,PFUNCAO.NOME
Desde já, agradeço as ajudas!
gostaria de uma ajuda para conseguir desvendar esta SQL que está dificil!!! rsrs
Estou montando um relatório onde preciso buscar o campo do Ultimo e Penultimo Salário, Ultima Função e Penultima Função, ou seja, vou ter 2 campos na Consulta que vão buscar as penultimas informações.
Consegui montar a SQL para buscar estas informações de um funcionário.... Mas o problema é que com Sub-select não estou conseguindo buscar vários campos neste....
Vejam abaixo até onde cheguei, sendo que desta maneira trás todas as informações que desejo, mas de apenas um funcionários.... preciso de acertar esta sql para que tragam todos os funcionários:
SELECT PFUNC.CHAPA, PFUNC.NOME, PFUNC.DATAADMISSAO, (SELECT DTMUDANCA FROM PFHSTFCO WHERE CODCOLIGADA=32 AND MOTIVO='01' AND CHAPA=0020122)AS DATAULTPROMO,
PFUNC.SALARIO,PCARGO.NOME,PSECAO.DESCRICAO,
(SELECT TOP 1
PFUNCAO.NOME
FROM
PFHSTFCO A
JOIN PFHSTFCO B ON A.CHAPA = B.CHAPA AND A.CODCOLIGADA = B.CODCOLIGADA AND A.DTMUDANCA > B.DTMUDANCA
JOIN PFUNCAO(NOLOCK) ON PFUNCAO.CODIGO=B.CODFUNCAO
WHERE A.CHAPA = '0020122'
ORDER BY A.DTMUDANCA DESC, B.DTMUDANCA DESC) AS FUNC_ANTES,
PFUNCAO.NOME AS FUNC_ATUAL,
(SELECT TOP 1
B.SALARIO
FROM
PFHSTSAL A
JOIN PFHSTSAL B ON A.CHAPA = B.CHAPA AND A.CODCOLIGADA = B.CODCOLIGADA AND A.DTMUDANCA > B.DTMUDANCA
WHERE A.CHAPA = '0020122'
ORDER BY A.DTMUDANCA DESC, B.DTMUDANCA DESC) AS SAL_ANTERIOR
FROM PFUNC(NOLOCK) LEFT
JOIN PSECAO(NOLOCK) ON PFUNC.CODSECAO=PSECAO.CODIGO
JOIN PFUNCAO(NOLOCK) ON PFUNC.CODFUNCAO=PFUNCAO.CODIGO AND PSECAO.CODCOLIGADA=PFUNCAO.CODCOLIGADA
JOIN PFHSTFCO(NOLOCK) ON PFUNCAO.CODIGO=PFHSTFCO.CODFUNCAO AND PFUNC.CODCOLIGADA=PFHSTFCO.CODCOLIGADA AND PFUNC.CHAPA=PFHSTFCO.CHAPA
JOIN PCARGO(NOLOCK) ON PFUNC.CODCOLIGADA=PCARGO.CODCOLIGADA AND PCARGO.CODIGO=PFUNCAO.CARGO
WHERE PFUNC.CODCOLIGADA=32 AND PFHSTFCO.CHAPA<>'0'
GROUP BY PFUNC.CHAPA, PFUNC.NOME, PFUNC.DATAADMISSAO, PFUNC.SALARIO,PCARGO.NOME,PSECAO.DESCRICAO,PFUNCAO.NOME
Desde já, agradeço as ajudas!
Benedito Neto
Curtir tópico
+ 0
Responder
Posts
13/05/2014
Jair N.
Complicado, não deu para ver direito sua lógica, mas te dou uma ideia, se, este lhe permite trazer apenas um funcionário, logo se você fizer uma consulta na tabela de funcionários e utilizar esta sua "consulta" como uma "subconsulta" passando como um parâmetro cada funcionário, ai terá de todos. PS: Também não sei o quanto vai demorar, acredito que deva criar uma "função" interna para melhorar a performance. Bem como último você pode agrupar pela "última data do seu histórico para cada funcionário" veja se a instrução RANK() OVER (ORDER BY x) pode colocar seu histórico na ordem desejada para pegar o último e o penultimo. registro de cada funcionário...
Atc.
Atc.
Responder
Gostei + 0
23/05/2014
Emerson Nascimento
tente:
SELECT
FUN.CHAPA, FUN.NOME, FUN.DATAADMISSAO, FUN.SALARIO SAL_ATUAL, F.NOME AS FUNC_ATUAL,
MAX(HF.DTMUDANCA) AS DATAULTPROMO,
C.NOME,
S.DESCRICAO,
( SELECT TOP 1 B.NOME
FROM PFHSTFCO A
LEFT JOIN PFUNCAO(NOLOCK) B ON B.CODIGO=A.CODFUNCAO
WHERE A.CHAPA = FUN.CHAPA AND A.MOTIVO = '01' AND A.DTMUDANCA < MAX(HF.DTMUDANCA)
ORDER BY A.DTMUDANCA DESC
) AS FUNC_ANTES,
( SELECT TOP 1 B.SALARIO
FROM PFHSTSAL A
WHERE A.CHAPA = FUN.CHAPA AND A.DTMUDANCA < MAX(HF.DTMUDANCA)
ORDER BY A.DTMUDANCA DESC
) AS SAL_ANTERIOR
FROM PFUNC(NOLOCK) FUN
LEFT JOIN PSECAO(NOLOCK) S
ON S.CODIGO = FUN.CODSECAO
LEFT JOIN PFUNCAO(NOLOCK) F
ON F.CODIGO = FUN.CODFUNCAO AND F.CODCOLIGADA = S.CODCOLIGADA
LEFT JOIN PFHSTFCO(NOLOCK) HF
ON HF.CODFUNCAO = F.CODIGO AND HF.CODCOLIGADA = F.CODCOLIGADA AND HF.CHAPA = FUN.CHAPA
LEFT JOIN PCARGO(NOLOCK) C
ON C.CODIGO = F.CARGO AND C.CODCOLIGADA = F.CODCOLIGADA
WHERE
FUN.CODCOLIGADA = 32 AND HF.CHAPA <> '0'
GROUP
BY FUN.CHAPA, FUN.NOME, FUN.DATAADMISSAO, FUN.SALARIO, C.NOME, S.DESCRICAO, F.NOME
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)