none
Consulta SQL complicada RRS feed

  • Pergunta

  •  

    O sistema funciona da seguinte forma:

     

    Na tabela Padroes cadastro os padroes da Unidade, na tabela Revisoes cadastro as revisoes que o padrao sofreu, por exemplo Revisao 1.0, 1.4, 3.0, na tabela Treinamentos pego um funcionário falo que ele foi cadastrado no padrao XPTO na Revisao 2.0, lembro que na tabela Revisoes está cadastrada várias revisões para o padrao XPTO e na tabela Treinamento esão cadastrados várias revisões no padrao XPTO para o funcionário qualquer exemplo que ele está cadastrado na revisao 1.0, na 1.2, na 3.0 e outras conforme tabela Revisoes.

     

    Tabela Padroes

    CodigoPadrao

    NomePadrao

    Periodicidade

    Observaxao

     

    Tabela Funcionarios

    Matricula

    NomeFuncionario

    DataAdmissao

    Cargo

     

    Tabela Revisoes

    CodigoPadrao

    NumeroRevisao

    DataRevisao

     

    Tabela Treinamento

    CodigoPadrao

    Matricula

    DataTreinamento

    RevisaoTreinado

    CargaHoraria (Campo DateTime)

     

    As tabelas estão com relacionamento da seguinte forma

    Treinamento.CodigoPadrao com Padroes.CodigoPadrao

    Treinamento.Chapa com Funcionarios.Chapa

    Padroes.CodigoPadrao com Revisoes.CodigoPadrao

     

    Preciso retirar um relatório da seguinte forma, pesquisar na tabela Treinamentos os treinamentos agrupados para Funcionario por Padrao, onde nesse relatorio preciso trazer apenas a versão mais nova que o Funcionário foi treinamento na tabela Treinamento, depois vai na tabela Padrao e pega o dado de Periodicidade e traz, vai na tabela Revisoes e pega a última versão do padrão cadastrado na tabela Revisoes para comparar se a última versão do padrão é igual a última versão que ele foi treinado para dar um status de treinado ou não treinado.

     

    1 - Estão vindo todos os treinamentos dos Funcionários e não a última revisão que ele foi treinado.

    2 - Estou tendo que fazer um MAX na Datas por estão dentro do GROUP BY.

    3 - Se não colocar colocar o MAX na CargaHoraria traz todos os treinamento.

    4 - Estou tendo que colocar todos os campos no GROUP BY, acho por isso que está trazendo todos os treinamentos, pois os campos DataTreinado e CargaHoraria tem dados diferentes, pois ele foi treinado na Revisao 1.o no dia 12/12/2007 e na Revisao 3.0 no dia 12/12/2008 e da mesma forma a CargaHoraria varia.

     

    SELECT Funcionarios.Matricula, Funcionarios.NomeFuncionario, Funcionarios.Cargo, Funcionarios.Funcao, LNT.Codigo

    , MAX(CONVERT(REAL,Revisoes.NumeroRevisao)) AS Rev_Padrao, MAX(Revisoes.DataRevisao) , MAX(LNT.DataTreinamento) ,LNT.CargaHoraria,Padroes.Periodicidade,

    MAX(CONVERT(REAL,LNT.RevisaoTreinado)) AS Rev_LNT,Padroes.Observacao

    FROM Revisoes INNER JOIN

    Padroes ON Revisoes.CodigoPadrao= Padroes.CodigoPadrao INNER JOIN

    LNT INNER JOIN

    Funcionarios ON LNT.Matricula = Funcionarios.Matricula ON Padroes.CodigoPadrao = LNT.CodigoPadrao AND Revisoes.Codigo = LNT.CodigoPadrao

     

    GROUP BY LNT.Codigo, Funcionarios.Chapa, Funcionarios.Cargo, Padroes.Periodicidade, Padroes.Observacao,

    Funcionarios.Funcionario, Padroes.Padrao, Funcionarios.Funcao,LNT.DataTreinamento,LNT.CargaHoraria

     

    ORDER BY Funcionarios.Funcionario, LNT.CodigoPadrao, MAX(LNT.RevisaoTreinado)

     

    Conto com a ajuda de todos isso é de suma importância para mim finalizar todo os sistema.

    quinta-feira, 28 de agosto de 2008 23:33

Todas as Respostas

  • Se entendi acho que deveria simplificar o SQL utilizando ( select top 1  CONVERT(REAL,Revisoes.NumeroRevisao) from Revisoes where Revisoes.CodigoPadrao= Padroes.CodigoPadrao  order by NumeroRevisao desc) AS Rev_Padrao ) na coluna Rev_padrao e tirar a tabela Revisao do inner join. 
    quinta-feira, 28 de julho de 2011 16:56
  • Luís,

    Você já pensou em utilizar Sub-querys ao invês de realizar tudo dentro de uma única query?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    quinta-feira, 28 de julho de 2011 20:24