GARANTIR DESCONTO

Fórum erro com group by #274621

30/03/2005

0

Quando executo essa sql:

select l.datalanc, l.lote, l.linha, l.valor, l.conta_debito, l.conta_credito, l.complemento1,
(select p.conta from plano p where p.cod_emp=l.cod_emp and p.codigo=l.conta_debito) as debito,
(select p.conta from plano p where p.cod_emp=l.cod_emp and p.codigo=l.conta_credito) as credito
from ...
where ...
group by l.datalanc, l.lote, l.linha, l.valor, l.conta_debito, l.conta_credito, l.complemento1

Ocorre o seguinte erro:
Invalid expression in the select list (not contained in either an aggregate function or the group by clause)

Sei que se usasse uma função no subselect o group by estaria correto, mas como faço quando é um simples subselect?? :?:

Livia


Livia

Livia

Responder

Posts

30/03/2005

Ehvasc

Cara Colega,


Realmente, pra usar o group by tem que usar uma função agregada (SUM,AVG, etc). Não estou vendo onde vc pode usar uma função agregada no seu código. Tente usar DISTINCT ou uma função agregada em uma coluna que vc não utlize, só pra poder usar o GROUP BY.

Espero ter ajudado. Qualquer dúvida entre em contato.

Boa sorte e até a próxima


Responder

Gostei + 0

30/03/2005

Livia

Usando o distinct não funcionou, e não tenho com usar outra função p/ trazer esse campo (subconsulta). Para q a sql me traga os dados certos preciso dos dados do select e usar o group by :( , se tiverem outra solução agradeço.

Livia


Responder

Gostei + 0

30/03/2005

Faelcavalcanti

Coloque todo o conteúdo SQL, para que assim possamos avaliá-la em um contexto geral, principalmente por conta dos filtros. :wink:


Responder

Gostei + 0

30/03/2005

Livia

Lá vai:
select l.datalanc, l.lote, l.linha, l.valor, l.conta_debito, l.conta_credito, l.complemento1, (select p.conta from plano p where p.cod_emp=l.cod_emp and p.codigo=l.conta_debito) as debito, (select p.conta from plano p where p.cod_emp=l.cod_emp and p.codigo=l.conta_credito) as credito from lancamento l where l.cod_emp=1 and (l.conta_credito=8 or l.conta_debito=8) and l.situacao=´1´ and l.datalanc between ´2004-12-01´ and ´2004-12-01´ union all select l.datalanc, l.lote, l.linha, l.valor, l.conta_debito, l.conta_credito, l.complemento1 (select p.conta from plano p where p.cod_emp=l.cod_emp and p.codigo=l.conta_debito) as debito, (select p.conta from plano p where p.cod_emp=l.cod_emp and p.codigo=l.conta_credito) as credito from lancamento l where l.cod_emp=1 and l.mes_ano_base containing(select max(q.mes_ano_base) from saldos q where q.cod_emp=1 and q.conta=8 and q.mes_ano_base between ´2004-01-01´ and ´2004-11-01´) and ((l.conta_credito not in (select distinct(conta) from saldos where cod_emp= 1 and mes_ano_base=´2004-12-01´)) or (l.conta_debito not in (select distinct(conta) from saldos where cod_emp=1 and mes_ano_base=´2004-12-01´)))



Responder

Gostei + 0

31/03/2005

Faelcavalcanti

Oi livia, blz!

Olha só também estou com dúvidas em relação à como declarar a subquery, a partir de um group by, mas o maior problema é o [b:442ca7a8c5]union all[/b:442ca7a8c5]. Veja a minha gambiarra abaixo:

SELECT L.DATALANC,     L.LOTE, L.LINHA, L.VALOR,
       L.CONTA_DEBITO, L.CONTA_CREDITO, L.COMPLEMENTO1,
       P.CONTA
FROM LANCAMENTO L, PLANO P
WHERE P.COD_EMP = L.COD_EMP OR P.CODIGO = L.CONTA_DEBITO OR P.CODIGO = L.CONTA_CREDITO
AND   L.SITUACAO = ´1´ AND L.DATALANC BETWEEN ´2004-12-01´ AND ´2004-12-01´

UNION ALL

SELECT L.DATALANC,     L.LOTE, L.LINHA, L.VALOR,
       L.CONTA_DEBITO, L.CONTA_CREDITO, L.COMPLEMENTO1,
       P.CONTA
FROM LANCAMENTO L, PLANO P
WHERE P.COD_EMP = L.COD_EMP OR P.CODIGO = L.CONTA_DEBITO OR P.CODIGO = L.CONTA_CREDITO
AND   L.SITUACAO = ´1´ AND L.DATALANC BETWEEN ´2004-12-01´ AND ´2004-12-01´
AND   L.MES_ANO_BASE CONTAINING (SELECT MAX(Q.MES_ANO_BASE) FROM SALDOS Q
                                 WHERE Q.COD_EMP=1 AND Q.CONTA=8
                                 AND Q.MES_ANO_BASE BETWEEN ´200-01-01´ AND ´2004-11-01´
                                 AND ((L.CONTA_CREDITO NOT IN (SELECT DISTINCT (CONTA)) FROM SALDOS
                                                               WHERE COD_EMP=1 AND MES_ANO_BASE=´2004-12-01´)))


O que ficou faltando eu colocar foi o [b:442ca7a8c5]group by[/b:442ca7a8c5], não foi por preguiça não, foi por incerteza de como ficaria com o [b:442ca7a8c5]union[/b:442ca7a8c5]. Mas tipow, minha idéia era acabar com os subselects, que tinham acima depois associá-los ao group by, neste caso ficou faltando o último. Mas pelo mínimo que tentei espero ter te ajudado!!! Seria bom se existisse um hibernate para o delphi nestas horas! :roll:

:wink:
Falow!


Responder

Gostei + 0

04/04/2005

Livia

Essa foi a minha gambiarra final: coloquei 2 aliases p/ um mesmo banco trazendo informações diferentes, não sei pode acontecer algum problema, mas momentaneamente funcionou:
select l.mes_ano_base, l.datalanc, l.lote, l.linha, l.valor, l.conta_debito, l.conta_credito, l.complemento1, p.conta as debito, p2.conta as credito
from lancamento l
left outer join plano p on (p.cod_emp=l.cod_emp and p.codigo=l.conta_debito)
left outer join plano p2 on (p2.cod_emp=l.cod_emp and p2.codigo=l.conta_credito)
where  l.cod_emp=:cod_emp and (l.conta_credito=:codigo or l.conta_debito=:codigo)
and l.situacao=´1´ and l.datalanc between :inicial and :final
group by l.mes_ano_base, l.datalanc, l.lote, l.linha, l.valor, l.conta_debito, l.conta_credito, l.complemento1, p.conta, p2.conta

union all
select l.mes_ano_base, l.datalanc, l.lote, l.linha, l.valor, l.conta_debito, l.conta_credito, l.complemento1, p.conta as debito, p2.conta as credito
from lancamento l
left outer join plano p on (p.cod_emp=l.cod_emp and p.codigo=l.conta_debito)
left outer join plano p2 on (p2.cod_emp=l.cod_emp and p2.codigo=l.conta_credito)
where l.cod_emp=:cod_emp and (l.conta_credito=:codigo or l.conta_debito=:codigo)
   and l.mes_ano_base containing(select max(q.mes_ano_base)
                                 from saldos q where q.cod_emp=:cod_emp and q.conta=:codigo
                                   and q.mes_ano_base between :inicial2 and :final2)
   and ((l.conta_credito not in (select distinct(conta) from saldos where cod_emp=:cod_emp
                                   and mes_ano_base=:data_base)) or
       (l.conta_debito not in (select distinct(conta) from saldos where cod_emp=:cod_emp
                                   and mes_ano_base=:data_base)))
group by l.mes_ano_base, l.datalanc, l.lote, l.linha, l.valor, l.conta_debito, l.conta_credito, l.complemento1, p.conta, p2.conta
order by 2,3,4


Vlw!
Livia


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar