Erro no Group by (alguem me ajude)

Firebird

24/02/2011

Select O.RAZAO_SOCIAL AS CAMPO1,--Campo1
--Campo 2
(SELECT (COALESCE(SUM(GL.CONT_PAT_APOSEN),0) +
COALESCE(SUM(GL.CONT_PAT_ATIVOS),0) +
COALESCE(SUM(GL.CONT_PAT_DOENCA),0) +
COALESCE(SUM(GL.CONT_PAT_MATERN),0) +
COALESCE(SUM(GL.CONT_PAT_PENSIO),0))

FROM GUIA_PAGAMENTO GP, GUIA_LANCAMENTO GL1
WHERE GP.ID_GUIA_LANCAMEN = GL1.ID_GUIA
AND GL.MES = GL1.MES) AS CAMPO2,
--Campo 3
(SELECT (COALESCE(SUM(GP.CONT_PAT_APOSEN),0) +
COALESCE(SUM(GP.CONT_PAT_ATIVOS),0) +
COALESCE(SUM(GP.CONT_PAT_DOENCA),0) +
COALESCE(SUM(GP.CONT_PAT_MATERN),0) +
COALESCE(SUM(GP.CONT_PAT_PENSIO),0))

FROM GUIA_PAGAMENTO GP, GUIA_LANCAMENTO GL1
WHERE GP.ID_GUIA_LANCAMEN = GL1.ID_GUIA
AND GL.MES = GL1.MES) AS CAMPO3,
--Campo 4
(SELECT (COALESCE(SUM(GB.CONT_PAT_APOSEN),0) +
COALESCE(SUM(GB.CONT_PAT_ATIVOS),0) +
COALESCE(SUM(GB.CONT_PAT_DOENCA),0) +
COALESCE(SUM(GB.CONT_PAT_MATERN),0) +
COALESCE(SUM(GB.CONT_PAT_PENSIO),0))

FROM GUIA_BAIXA GB, GUIA_LANCAMENTO GL1
WHERE GB.ID_GUIA = GL1.ID_GUIA
AND GL.MES = GL1.MES) AS CAMPO4

--Campo5 (CAMPO 1 - CAMPO 2 - CAMPO3)

FROM ORGAO O, GUIA_LANCAMENTO GL
WHERE GL.ANO_COMPETENCIA = 2011
AND GL.ID_ORGAO = O.ID_ORGAO
GROUP BY CAMPO1, CAMPO2, CAMPO3, CAMPO4
 



Ja tentei ordenar de varias outras formas e todas estão dando erros alguem sabe como consertar?
Themer Batista

Themer Batista

Curtidas 0

Melhor post

Junior Miranda

Junior Miranda

25/02/2011

Esse campo 5 é so um comentario manolo, meu problema mesmo é a merda do GROUP By que não da certo de jeito nenhum.


O colegar Wilson usou parte do tempo dele para tentar lhe ajudar! Então, vamos ter calma! Acertar ou errar, são consequências. Quanto ao erro... vamos a uma tradução tosca e direta da mensagem... "Não use funções Agregadas como o SUM no group by".


[]'s
GOSTEI 1

Mais Respostas

Wilson Junior

Wilson Junior

24/02/2011

Qual a versão do Firebird você está utilizando e qual o erro que aparece?

Aguardo retorno.
GOSTEI 0
Themer Batista

Themer Batista

24/02/2011

A versão do Firebird é 2.5 o erro é este: Invalid token.Dynamic SQL Error.SQL error code = -104.Cannot use an aggregate function in a GROUP BY clause.
Eu ja tentei passando todos os tipos de group by, tentei usando id das tebelas que tenho e tal.
GOSTEI 0
Wilson Junior

Wilson Junior

24/02/2011

Agora que vi, o Firebird não suporta colocar isto
--Campo5 (CAMPO 1 - CAMPO 2 - CAMPO3)


Espero ter colaborado.
GOSTEI 0
Themer Batista

Themer Batista

24/02/2011

Esse campo 5 é so um comentario manolo, meu problema mesmo é a merda do GROUP By que não da certo de jeito nenhum.
GOSTEI 0
Wilson Junior

Wilson Junior

24/02/2011

Sim, eu me passei...me desculpe...

Bom, vc não possui nenhuma rotina de agrupamento (SUM, AVG, etc) para efetuar o groupy by, por isto ele diz que está incorreto. Vc pode ateh falar que os seus subselects utilizam, mas para vc entender melhor, o subselect é um processo separado que retorna um valor. Sugiro vc colocar um SUM antes de cada subselect e mandar agrupar somente pelo Campo1.

Select O.RAZAO_SOCIAL AS CAMPO1,
--Campo 2
SUM(SELECT (COALESCE(SUM(GL.CONT_PAT_APOSEN),0) +
COALESCE(SUM(GL.CONT_PAT_ATIVOS),0) +
COALESCE(SUM(GL.CONT_PAT_DOENCA),0) +
COALESCE(SUM(GL.CONT_PAT_MATERN),0) +
COALESCE(SUM(GL.CONT_PAT_PENSIO),0))

FROM GUIA_PAGAMENTO GP, GUIA_LANCAMENTO GL1
WHERE GP.ID_GUIA_LANCAMEN = GL1.ID_GUIA
AND GL.MES = GL1.MES) AS CAMPO2,
--Campo 3
SUM(SELECT (COALESCE(SUM(GP.CONT_PAT_APOSEN),0) +
COALESCE(SUM(GP.CONT_PAT_ATIVOS),0) +
COALESCE(SUM(GP.CONT_PAT_DOENCA),0) +
COALESCE(SUM(GP.CONT_PAT_MATERN),0) +
COALESCE(SUM(GP.CONT_PAT_PENSIO),0))

FROM GUIA_PAGAMENTO GP, GUIA_LANCAMENTO GL1
WHERE GP.ID_GUIA_LANCAMEN = GL1.ID_GUIA
AND GL.MES = GL1.MES) AS CAMPO3,
--Campo 4
SUM(SELECT (COALESCE(SUM(GB.CONT_PAT_APOSEN),0) +
COALESCE(SUM(GB.CONT_PAT_ATIVOS),0) +
COALESCE(SUM(GB.CONT_PAT_DOENCA),0) +
COALESCE(SUM(GB.CONT_PAT_MATERN),0) +
COALESCE(SUM(GB.CONT_PAT_PENSIO),0))

FROM GUIA_BAIXA GB, GUIA_LANCAMENTO GL1
WHERE GB.ID_GUIA = GL1.ID_GUIA
AND GL.MES = GL1.MES) AS CAMPO4

--Campo5 (CAMPO 1 - CAMPO 2 - CAMPO3)

FROM ORGAO O, GUIA_LANCAMENTO GL
WHERE GL.ANO_COMPETENCIA = 2011
AND GL.ID_ORGAO = O.ID_ORGAO
GROUP BY CAMPO1


Espero ter colaborado.
GOSTEI 1
Themer Batista

Themer Batista

24/02/2011


  Junior eu sei e sou bem grato pelos favores que eu recebo, não quis ser grosso nem mau agressivo.
Mas o codigo continua com erro, da erro no group by :(
GOSTEI 1
Wilson Junior

Wilson Junior

24/02/2011

Onde indiquei não serião GL1 ?
--Campo 2
(SELECT (COALESCE(SUM(GL.CONT_PAT_APOSEN),0) +
COALESCE(SUM(GL.CONT_PAT_ATIVOS),0) +
COALESCE(SUM(GL.CONT_PAT_DOENCA),0) +
COALESCE(SUM(GL.CONT_PAT_MATERN),0) +
COALESCE(SUM(GL.CONT_PAT_PENSIO),0))

FROM GUIA_PAGAMENTO GP, GUIA_LANCAMENTO GL1
WHERE GP.ID_GUIA_LANCAMEN = GL1.ID_GUIA
AND GL.MES = GL1.MES) AS CAMPO2,


Caso não seja, coloque aqui a estrutura das suas tabelas e resultado que espera obter.

Quanto aos seus comentários, prefiro nem entrar em detalhes, pois estamos aqui sempre para COLABORAR e não para ATRAPALHAR ou PREJUDICAR.

Espero ter colaborado.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/02/2011

deixa eu atravessar as respostas dos colegas....

o que você espera como resultado para essa query ?
GOSTEI 0
Themer Batista

Themer Batista

24/02/2011

Eu estou fazendo consultas de um relatorio para eu passar para o IREPORT e desenhalo por isso to jogando nos campos, o relatorio é a soma de alguns itens que tenho na tabela guia_lancamento essas guias são lançadas com um orgão, ao entender da logica que o cara que eu trabalho ta precisando é o seguinte, vc lança a guai na tabela guia de lançamentos GL vc paga algum valor dessa guia na tabela guia de pagamentos GP e da baixa em alguns valores que são pagos pela prefeitura na guia_baixa GB tanto que meu campo 5 seria gl - (gp+gb).
Desde já Obrigado aos que tem me ajudado.
GOSTEI 0
Themer Batista

Themer Batista

24/02/2011

COnsegui fazer ficou da seguinte forma.
SELECT GL.MES, GL.ID_ORGAO,       O.NOME_FANTASIA AS CAMPO1,       (COALESCE(SUM(GL.CONT_PAT_APOSEN),0)+        COALESCE(SUM(GL.CONT_PAT_ATIVOS),0)+        COALESCE(SUM(GL.CONT_PAT_DOENCA),0)+        COALESCE(SUM(GL.CONT_PAT_MATERN),0)+        COALESCE(SUM(GL.CONT_PAT_PENSIO),0)) AS CAMPO2,       --CAMPO1       (SELECT COALESCE(SUM(GP.CONT_PAT_APOSEN),0)+               COALESCE(SUM(GP.CONT_PAT_ATIVOS),0)+               COALESCE(SUM(GP.CONT_PAT_DOENCA),0)+               COALESCE(SUM(GP.CONT_PAT_MATERN),0)+               COALESCE(SUM(GP.CONT_PAT_PENSIO),0)          FROM GUIA_PAGAMENTO GP, GUIA_LANCAMENTO GL1         WHERE GL1.ID_GUIA  = GP.ID_GUIA_LANCAMEN           AND GL.ID_ORGAO  = GL1.ID_ORGAO           AND GL.MES = GL1.MES) AS CAMPO3,
       (SELECT COALESCE(SUM(GB.CONT_PAT_APOSEN),0)+               COALESCE(SUM(GB.CONT_PAT_ATIVOS),0)+               COALESCE(SUM(GB.CONT_PAT_DOENCA),0)+               COALESCE(SUM(GB.CONT_PAT_MATERN),0)+               COALESCE(SUM(GB.CONT_PAT_PENSIO),0)          FROM GUIA_BAIXA GB, GUIA_LANCAMENTO GL1         WHERE GB.ID_GUIA  = GL1.ID_GUIA           AND GL.ID_ORGAO = GL1.ID_ORGAO           AND GL.MES  = GL1.MES)   AS CAMPO4,      ((COALESCE(SUM(GL.CONT_PAT_APOSEN),0)+        COALESCE(SUM(GL.CONT_PAT_ATIVOS),0)+        COALESCE(SUM(GL.CONT_PAT_DOENCA),0)+        COALESCE(SUM(GL.CONT_PAT_MATERN),0)+        COALESCE(SUM(GL.CONT_PAT_PENSIO),0)) -       --CAMPO1       (SELECT COALESCE(SUM(GP.CONT_PAT_APOSEN),0)+               COALESCE(SUM(GP.CONT_PAT_ATIVOS),0)+               COALESCE(SUM(GP.CONT_PAT_DOENCA),0)+               COALESCE(SUM(GP.CONT_PAT_MATERN),0)+               COALESCE(SUM(GP.CONT_PAT_PENSIO),0)          FROM GUIA_PAGAMENTO GP, GUIA_LANCAMENTO GL1         WHERE GL1.ID_GUIA  = GP.ID_GUIA_LANCAMEN           AND GL.ID_ORGAO  = GL1.ID_ORGAO) -
       (SELECT COALESCE(SUM(GB.CONT_PAT_APOSEN),0)+               COALESCE(SUM(GB.CONT_PAT_ATIVOS),0)+               COALESCE(SUM(GB.CONT_PAT_DOENCA),0)+               COALESCE(SUM(GB.CONT_PAT_MATERN),0)+               COALESCE(SUM(GB.CONT_PAT_PENSIO),0)          FROM GUIA_BAIXA GB, GUIA_LANCAMENTO GL1         WHERE GB.ID_GUIA  = GL1.ID_GUIA           AND GL.ID_ORGAO = GL1.ID_ORGAO)) AS CAMPO5
  FROM GUIA_LANCAMENTO GL, ORGAO O WHERE GL.ANO_COMPETENCIA = 2009   AND GL.ID_ORGAO = O.ID_ORGAO   AND O.NOME_FANTASIA = 'PREFEITURA DE MODELO'GROUP BY GL.ID_ORGAO, CAMPO1, GL.MES
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/02/2011

isso vai funcionar mesmo? o relacionamento das subselects está correto?

pela minha leitura os valores podem dar errado, pois da forma como está você terá valores errados caso o mesmo órgão tenha lançamentos em anos diferentes, visto que você relacionou as subselects somente ao órgao.

essa instrução que estou te passando relaciona também ao mês e ao ano.

SELECT GL.MES, GL.ID_ORGAO,
       O.NOME_FANTASIA AS CAMPO1,

       (COALESCE(SUM(GL.CONT_PAT_APOSEN),0)+
        COALESCE(SUM(GL.CONT_PAT_ATIVOS),0)+
        COALESCE(SUM(GL.CONT_PAT_DOENCA),0)+
        COALESCE(SUM(GL.CONT_PAT_MATERN),0)+
        COALESCE(SUM(GL.CONT_PAT_PENSIO),0)) AS CAMPO2,

       (SELECT COALESCE(SUM(GP.CONT_PAT_APOSEN),0)+
               COALESCE(SUM(GP.CONT_PAT_ATIVOS),0)+
               COALESCE(SUM(GP.CONT_PAT_DOENCA),0)+
               COALESCE(SUM(GP.CONT_PAT_MATERN),0)+
               COALESCE(SUM(GP.CONT_PAT_PENSIO),0)
        FROM GUIA_PAGAMENTO GP, GUIA_LANCAMENTO GL1
        WHERE GL1.ID_GUIA = GP.ID_GUIA_LANCAMEN
          AND GL1.ID_ORGAO = GL.ID_ORGAO
          AND GL1.ANO_COMPETENCIA = GL.ANO_COMPETENCIA
          AND GL1.MES = GL.MES) AS CAMPO3,

       (SELECT COALESCE(SUM(GB.CONT_PAT_APOSEN),0)+
               COALESCE(SUM(GB.CONT_PAT_ATIVOS),0)+
               COALESCE(SUM(GB.CONT_PAT_DOENCA),0)+
               COALESCE(SUM(GB.CONT_PAT_MATERN),0)+
               COALESCE(SUM(GB.CONT_PAT_PENSIO),0)
        FROM GUIA_BAIXA GB, GUIA_LANCAMENTO GL1
        WHERE GB.ID_GUIA  = GL1.ID_GUIA
          AND GL1.ID_ORGAO = GL.ID_ORGAO
          AND GL1.ANO_COMPETENCIA = GL.ANO_COMPETENCIA
          AND GL1.MES = GL.MES) AS CAMPO4,

       ((COALESCE(SUM(GL.CONT_PAT_APOSEN),0)+
         COALESCE(SUM(GL.CONT_PAT_ATIVOS),0)+
         COALESCE(SUM(GL.CONT_PAT_DOENCA),0)+
         COALESCE(SUM(GL.CONT_PAT_MATERN),0)+
         COALESCE(SUM(GL.CONT_PAT_PENSIO),0)) -

        (SELECT COALESCE(SUM(GP.CONT_PAT_APOSEN),0)+
                COALESCE(SUM(GP.CONT_PAT_ATIVOS),0)+
                COALESCE(SUM(GP.CONT_PAT_DOENCA),0)+
                COALESCE(SUM(GP.CONT_PAT_MATERN),0)+
                COALESCE(SUM(GP.CONT_PAT_PENSIO),0)
         FROM GUIA_PAGAMENTO GP, GUIA_LANCAMENTO GL1
         WHERE GL1.ID_GUIA = GP.ID_GUIA_LANCAMEN
           AND GL1.ID_ORGAO = GL.ID_ORGAO
           AND GL1.ANO_COMPETENCIA = GL.ANO_COMPETENCIA
           AND GL1.MES = GL.MES) -

        (SELECT COALESCE(SUM(GB.CONT_PAT_APOSEN),0)+
                COALESCE(SUM(GB.CONT_PAT_ATIVOS),0)+
                COALESCE(SUM(GB.CONT_PAT_DOENCA),0)+
                COALESCE(SUM(GB.CONT_PAT_MATERN),0)+
                COALESCE(SUM(GB.CONT_PAT_PENSIO),0)
         FROM GUIA_BAIXA GB, GUIA_LANCAMENTO GL1
         WHERE GB.ID_GUIA  = GL1.ID_GUIA
           AND GL1.ID_ORGAO = GL.ID_ORGAO
           AND GL1.ANO_COMPETENCIA = GL.ANO_COMPETENCIA
           AND GL1.MES = GL.MES)
       ) AS CAMPO5

FROM GUIA_LANCAMENTO GL, ORGAO O
WHERE GL.ANO_COMPETENCIA = 2009
   AND GL.ID_ORGAO = O.ID_ORGAO
   AND O.NOME_FANTASIA = 'PREFEITURA DE MODELO'
GROUP BY GL.ID_ORGAO, GL.ANO_COMPETENCIA, O.NOME_FANTASIA, GL.MES

outra coisa que eu evitaria seria gerar esse campo 5. você está gastando recursos do SGBDR à toa, visto que pode fazer a conta ao imprimir o relatório, evitando, assim, desperdício de recursos.

GOSTEI 0
POSTAR