ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Listar Ultimo Registro Firebird [RESOLVIDO]

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
walsh
Novato
Novato


Registrado: Domingo, 28 de Dezembro de 2014
Mensagens: 65

MensagemEnviada: Seg Jun 12, 2017 10:15 am    Assunto: Listar Ultimo Registro Firebird [RESOLVIDO] Responder com Citação

Olá pessoal!

estou tentando fazer um sql de um banco de dados firebird de um sistema de folha de pagamento, eu preciso de varios campos de 5 tabelas... até ai tudo bem o sql está pronto mas ele puxa 2 ou 3 registros do mesmo funcionario.

Então fui verificar e tem uma tabela chamada CARGOS que grava a função do funcionário e grava todas as alterações de função, então por exemplo se o funcionário foi contratado como auxiliar de produção e depois foi promovido para coordenador de setor ele terá 2 vezes a ID dele nessa tabela CARGOS e quando executo o SQL puxa 2 vezes o nome dele mas com funções diferentes.

Eu quero que puxe somente uma vez cada funcionário e com a função mais atual, nessa tabela CARGOS tem um campo data que é a data da alteração da função, tentei utilizar o comando MAX para pegar a ultima data mas mesmo assim não está vindo correto, o sql roda normal mas os dados continuam vindo mais de uma vez se tiver alteração de função.

Basicamente seria assim que fiz o sql, são mais campos e mais tabelas mas fiz um basicão para teste e mesmo assim vem mais de um funcionário com todas as funções que ele exerceu:

SELECT
FUNC.NOME,
CAR.CARGO,
MAX(CAR.DATA)

FROM
EMPREGADOS FUNC
JOIN CARGOS CAR ON FUNC.IDEMPREGADO = CAR.IDEMPREGADO

GROUP BY
FUNC.NOME,
CAR.CARGO,
CAR.DATA


Editado pela última vez por walsh em Qua Jun 14, 2017 9:00 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Seg Jun 12, 2017 10:24 am    Assunto: Responder com Citação

Bom dia,

Experimente utilizar uma CTE para obter o último cargo conforme exemplo abaixo:

Código:
with CTE_Cargos as
(
    select
        IdEmpregado,
        max(Data) as Data
    from Cargos
    group by
        IdEmpregado   
)

SELECT
    FUNC.NOME,
    CAR.CARGO,
    cc.Data
FROM EMPREGADOS FUNC
INNER JOIN CTE_Cargos as cc
    ON cc.IDMPREGADO = FUNC.IDEMPREGADO
INNER JOIN CARGOS CAR
    ON CAR.IDEMPREGADO = FUNC.IDEMPREGADO AND
       CAR.DATA = cc.Data


Espero que ajude


Editado pela última vez por imex em Ter Out 03, 2023 2:43 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
walsh
Novato
Novato


Registrado: Domingo, 28 de Dezembro de 2014
Mensagens: 65

MensagemEnviada: Seg Jun 12, 2017 3:14 pm    Assunto: Responder com Citação

amigo imex,

aparentemente deu tudo certo, fiz o teste com o pequeno sql e funcionou, dai refiz o sql normal e pelo que olhei por cima deu certo, listou somente um registro de cada funcionário e a ultima função da data de alteração.

Nem sabia que dava pra fazer isso no firebird... vivendo e aprendendo!

Muito Obrigado! Me quebrou um galhão!

abraço!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB