none
Ajuste de Consulta - Subconsulta com GROUP BY RRS feed

  • Pergunta

  • Fala pessoal!!!

    Estou tentando resolver um problema com minha consulta.

    Estou ajustando algumas rotinas em um sistema em VBA e me deparei com uma consulta feita em Access, ela funciona muito bem como uma consulta salva, porém estou tentando transforma-la em uma string, que será enviada (via execute) para o BD SQL.

    Pelo que entendi, o problema todo acontece porque ela tem como base, uma consulta agrupada.

    Segue a encrenca.....

    SELECT Sinistro.sinistro, Titular, Sinistrado, Clientes_Apolices.IdCliente, Clientes.NmCliente, Clientes.ClassCliente, Seguradora.codigo, Seguradora.Seguradora, Clientes_Apolices.Empresa, Empresa.NmEmpresa, ClassSinCob.DescCobert, Status.DescStatus, Sinistro.[dt evento] AS DtEvento, Sinistro.[dt aviso] AS DtAviso FROM ((((((Sinistro INNER JOIN Clientes_Apolices ON (Sinistro.Empresa = Clientes_Apolices.Empresa) AND (Sinistro.IdApolice = Clientes_Apolices.IdApolice)) INNER JOIN Apolice ON Clientes_Apolices.IdApolice = Apolice.IdApolice) INNER JOIN Seguradora ON Apolice.codigo = Seguradora.codigo) INNER JOIN Clientes ON Clientes_Apolices.IdCliente = Clientes.IdCliente) INNER JOIN (SELECT Sinistro, CodCobert, DescCobert FROM (SELECT Sinistro, Min(TipoCoberturas.SeqLogica) AS MinSeqLogica FROM TipoCoberturas INNER JOIN [Sinistros Cobertura] ON TipoCoberturas.CodCobert = [Sinistros Cobertura].CodCobert GROUP BY Sinistro) AS TpSinistroCOB INNER JOIN TipoCoberturas ON TpSinistroCOB.MinSeqLogica = TipoCoberturas.SeqLogica ORDER BY TpSinistroCOB.Sinistro) AS ClassSinCob ON Sinistro.sinistro = ClassSinCob.Sinistro) INNER JOIN Status ON Sinistro.Status = Status.Status) INNER JOIN Empresa ON (Clientes_Apolices.Empresa = Empresa.Empresa) AND (Clientes_Apolices.IdApolice = Empresa.IdApolice) WHERE Sinistro.sinistro = '12745816' ORDER BY Sinistro.sinistro;

    Sei que é difícil analisar sem o BD, mas se alguém tiver alguma dica, já ajudaria bastante!!!

    Já estou perdendo o pouco cabelo que tenho!!!!

    hahahahahahahahahaha

    Abraço a todos!!!



    • Editado CrisMaleta01 segunda-feira, 20 de junho de 2016 20:13
    segunda-feira, 20 de junho de 2016 17:56

Respostas

  • Olá.

    Pelo erro, você está usando ORDER BY em uma subquery. Isso não é permitido.

    Mantenha somente o último ORDER BY que aparece em sua query.



    • Editado Rafael Juca segunda-feira, 20 de junho de 2016 19:15
    segunda-feira, 20 de junho de 2016 19:12

Todas as Respostas

  • CrisMaleta01 

    Poste o erro pra gente tentar te ajudar melhor.

    segunda-feira, 20 de junho de 2016 18:11
  • OPAAA!!

    Fala povo!!!

    Acho que não faz diferença, mas a consulta será executada direto pelo VBA!!!

    Rodei esta consulta pelo execute no ambiente VBA e no SQL Management e o retorno é o mesmo!!!

    Erro em tempo de execução '-2147217900 (80040e14)':
    
    The ORDER BY clause is invalid in view, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also especified.

    Desde já agradeço!!!

    Abraço!!

    segunda-feira, 20 de junho de 2016 19:05
  • Olá.

    Pelo erro, você está usando ORDER BY em uma subquery. Isso não é permitido.

    Mantenha somente o último ORDER BY que aparece em sua query.



    • Editado Rafael Juca segunda-feira, 20 de junho de 2016 19:15
    segunda-feira, 20 de junho de 2016 19:12
  • Fala Juca!!

    Estava achando que o problema era este mesmo...   mas o problema, é que a base da consulta é uma consulta agrupada!!!

    Esse rolo, consiste em 3 consultas dependentes....   Preciso agrupar alguns dados para depois gerar uma consulta e por fim, gerar a consulta final...

    Existira uma forma de fazer essa consulta funcionar???

    Desde já agradeço!!!

    Abraço....

    segunda-feira, 20 de junho de 2016 19:19
  • Oi Cris,

    Você já retirou o ORDER BY?

    Creio que pode continuar dando erro, mas deve mudar a descrição.

    A princípio não vi nada errado com seu GROUP BY.


    segunda-feira, 20 de junho de 2016 19:30
  • Fala povo!!!

    Realmente foi uma cagada minha!!!!

    Bobeira pura!!!!

    Estava ordenando algo que eu só precisaria agrupar!!!!!

    hahahahahahaha

    Obrigado pela ajuda e desculpe a minha ignorância!!!

    Abraço!!!!

    segunda-feira, 20 de junho de 2016 20:11
  • CrisMaleta01

    Realmente o seu problema esta na sua sub query, mas aconselho vc usar a cláusula UNION para agrupar as tabelas, segue um exemplo;

    http://www.devmedia.com.br/conceitos-e-exemplos-praticos-union-e-subquery-sql-server-2008-parte-1/19166 


    segunda-feira, 20 de junho de 2016 20:23
  • Vlw Renato!!!

    Você acha que utilizando UNION melhora a questão do desempenho ou seria apenas mais uma forma de fazer a consulta???

    Pensei em jogar essa consulta como uma procedure....

    Alguém sabe se isso melhor alguma coisa???

    Desde já agradeço!!!

    Abraço...

    segunda-feira, 20 de junho de 2016 21:38
  • Bom dia CrisMaleta01 

    Em questão performance vai depender do volume de dados da query e de vários outros fatores físico como harder etc.. se a intenção é jogar na maquina do cliente,  como vc citado acima  que precisaria agrupar os dados no final em apenas uma consulta, acho que o UNION vai lhe atender bem. Se no caso a intenção é ter um servidor dedicado (especifico) pode-se exigir um pouco mais do banco, ainda mais o sql server que é bem robusto. A procedure também resolve seu problema mas dever se levado em consideração o que eu disse antes, principalmente se quiser usar somente o sdf que não executa esse tipo de procedimento. Bem é isso, espero te contribuído.

    Abraços  

    terça-feira, 21 de junho de 2016 11:45