none
Erro de múltiplos registros Group By com Join RRS feed

  • Pergunta

  • Olá,

    Preciso de ajuda para saber uma maneira, de como resolver um problema de retorno de vários registros.  Possuo 3 tabelas, são elas tblAderencia, tblMop e tblPontoRH no banco de dados MS Access.

    Estou usando a query abaixo:

    SELECT 
           A.DiaBase as Data,
           A.LoginAgente,

          IIf(min(A.PrimeiroLogin)>C.PrimeiroLogin,C.PrimeiroLogin,min(A.PrimeiroLogin)) AS [Primeiro Login], 

          IIf(max(A.UltimoLogout)<C.UltimoLogout,C.UltimoLogout,max(A.UltimoLogout)) AS [Último Logout]

    FROM tblPontoRH AS C 
    INNER JOIN 
    (
          tblAderencia AS A INNER JOIN tblMop AS B ON A.LoginAgente = B.Rede

    ON C.Matricula = B.Matricula

    GROUP BY A.DiaBase, A.LoginAgente, A.NomeAgente, A.PrimeiroLogin, C.PrimeiroLogin, A.UltimoLogout, C.UltimoLogout;


    O resultado, (filtrando um login qualquer do campo "LoginAgente") é:

    O erro do resultado acima, é que para cada data há mais de 1 registro de Primeiro Login e Último Logout. Eu preciso comparar os campos Primeiro Login, entre as tabelas tblAderencia e tblPontoRH, somente aquele que for o menor deve ser retornado. Seguindo o mesmo raciocínio, retornar apenas o maior Último Logout entre as duas tabelas, com uma única data para cada dia e não duas datas ou mais.

    Já tentei utilizar o LEFT JOIN, porém o resultado também gera erro.

    Há alguma maneira simples para resolver este problema?

    Desde já agradeço a ajuda de todos!

    Atenciosamente,

    Eduardo

    sábado, 30 de julho de 2016 04:44

Respostas

Todas as Respostas

  • Eduardo,

    Não sei como está sua estrutura aí, mas entendo que você tem mais de um registro para o ponto (tabela tblPontoRH) e um registro com a aderência (tabela tblAderencia) para cada usuário, sendo assim, tente dessa forma:

    SELECT A.DiaBase AS DATA,
           A.LoginAgente,
           CASE
               WHEN min(C.PrimeiroLogin) < min(A.PrimeiroLogin) THEN min(A.PrimeiroLogin)
               ELSE min(C.PrimeiroLogin)
           END AS [Primeiro Login],
           CASE
               WHEN max(C.UltimoLogout) > max(A.UltimoLogout) THEN max(A.UltimoLogout)
               ELSE max(C.UltimoLogout)
           END AS [Último Logout]
    FROM tblPontoRH AS C
    INNER JOIN ( tblAderencia AS A
                INNER JOIN tblMop AS B ON A.LoginAgente = B.Rede) ON C.Matricula = B.Matricula
    GROUP BY A.DiaBase,
             A.LoginAgente

    Abraço.


    Ruicci

    sábado, 30 de julho de 2016 14:25
  • Olá Ruicci,

    Primeiramente obrigado pela ajuda, não sou alguém que entende de SQL e sei fazer apenas consultas mais simples. Mas acredito que a query que você escreveu, na teoria, faz a mesma coisa que a consulta que eu criei.

    Referente a estrutura, a tabela tblAderencia pode haver mais de um registro no campo "PrimeiroLogin", por isso utilizo a função "min()" pois o que atende a minha necessidade é obter o menor Primeiro Login. A mesma coisa para o campo "UltimoLogout", que utilizo a função "max()", para retornar o maior Último Logout.

    A tabela tblPontoRH, possui um único registro de Primeiro Login e Último Logout, não havendo necessidade de usar as funções "min()" e "max()".

    Tentei agora e também em vezes passadas, utilizar a cláusula "CASE WHEN", mas acredito que ela não existe no banco de dados MS Access. Por isso ao tentar utilizar a sua query, não obtive êxito e tento resolver este problema com a função "IIf()".

    Mais uma vez, agradeço pela ajuda.

    Atenciosamente,

    Eduardo

    sábado, 30 de julho de 2016 14:56
  • Eduardo,

    Me desculpe, entendi que você tinha essa base no Access e estava no SQL Server agora. Veja que na solução que passei removi alguns campos do GROUP BY justamente para que não tenha valores duplicados no agrupamento, por favor, faça esse teste para ver se resolve seu problema.

    De:

    GROUP BY A.DiaBase, A.LoginAgente, A.NomeAgente, A.PrimeiroLogin, C.PrimeiroLogin, A.UltimoLogout, C.UltimoLogout


    Para:

    GROUP BY A.DiaBase, A.LoginAgente

    Abraço.


    Ruicci

    sábado, 30 de julho de 2016 15:10
  • Ruicci,

    Sua ajuda está sendo muito útil, sinto que estou perto de conseguir, mas ainda assim não dá certo.

    A sua dica me retorna o resultado esperado, porém somente se eu remover a condição para o Último Logout da consulta (abaixo), condição destacada em negrito:

    SELECT 
           A.DiaBase as Data,
           A.LoginAgente,

          IIf(min(A.PrimeiroLogin)>min(C.PrimeiroLogin),min(C.PrimeiroLogin),min(A.PrimeiroLogin)) AS [Primeiro Login],
          IIf(max(A.UltimoLogout)<C.UltimoLogout,C.UltimoLogout,max(A.UltimoLogout)) AS [Último Logout]
          

    FROM tblPontoRH AS C 
    INNER JOIN 
    (
          tblAderencia AS A INNER JOIN tblMop AS B ON A.LoginAgente = B.Rede

    ON C.Matricula = B.Matricula

    GROUP BY A.DiaBase, A.LoginAgente;

    Eu preciso do Primeiro Login e do Último Logout, mas ocorre um erro e até tentei agrupar os campos de Login e Logout, mas o resultado retornado é o mesmo da imagem que exibi no início da pergunta.

    Mas vlw a ajuda!

    Atenciosamente,

    Eduardo

    sábado, 30 de julho de 2016 15:53
  • Deleted
    sábado, 30 de julho de 2016 19:38
  • Olá José,

    Sua ajuda foi extremamente valiosa e o entendimento que você passou, sobre a lógica da criação da consulta é muito interessante. Mas infelizmente ainda é exibido o seguinte erro:

    Fiz uma pequena alteração na consulta, mas infelizmente o erro persiste:

    Acredito que o erro está no JOIN do MS Access, tenho pouco conhecimento de SQL e gastei uns 40 min. tentando resolver o problema.

    Mas obrigado José, a sua resposta me deu um bom entendimento.

    Atenciosamente,

    Eduardo

    sábado, 30 de julho de 2016 20:46
  • Deleted
    domingo, 31 de julho de 2016 14:29