Group By no firebird

O IBexpert (FireBird) não funciona com o Group By e SUM.

select p.id_nota, sum(p.valor_pago) from parcelas as P
group by p.id_nota

O resultado é um erro:
Undefined name.
Data type unknown.

SQLCODE: -204
SQLSTATE: HY004
GDSCODE: 335544573

O interessante é que funciona com o AVG:
select p.id_nota, avg(p.valor_pago) from parcelas as P
group by p.id_nota

Alguém poderia me explicar o por quê?

Google no seu erro:

Ou seja, provavelmente sua coluna valor_pago é de um tipo não suportado.

Documentação das funções de agregação: Chapter 9. Aggregate Functions

Valor_pago é um decimal(15,2) e não há valores empty nos campos.
No Delphi funcionou quando coloquei dialet 1 ao inves de 3. Fiz isto e ele calculou, no Delphi.

Se o problema é este, a questão é do campo do select. É como se ele não aceitasse o tipo de valor retornado? Como resolver?

Faz quase 20 anos a última vez que mexi com Firebird. Não sei te dar os detalhes. Não tem alguma função para converter tipos? Algo assim:

select p.id_nota, sum( CONVERTER_PARA_ALGO(p.valor_pago) ) from parcelas as p
group by p.id_nota

Tem e funciona, mas quando entra um novo campo de outra tabela o problema volta.

NÃO FUNCIONA
select p.id_nota, sum(cast(p.valor_pago as numeric)), c.nome from parcelas as p
join nota as n on p.id_nota = n.id_nota
join cliente AS c ON C.id_cliente = N.id_cliente
GROUP BY p.id_nota

Invalid token.
Dynamic SQL Error.
SQL error code = -104.

Qual o dialect do banco? É 1 ou 3? Se funciona no Delphi, pode ser algo com o ibexpert (configuração ou bug).

Fiz um pequeno teste aqui e seu select do primeiro post funciona normal:

Dados
image

Ao criar a tabela no banco com dialeto 1, o campo acaba como numeric, não decimal. Essa é a estrutura:
image

Select e resultado:

image

Embora eu use o FlameRobin, não o IBExpert.

Abraço.

O BD foi criado como 3. Mas não posso usar o 1, pois tem campos com timestamp e com certeza SQLs vão dar problemas no dialect 1.

Não precisa mudar o dialect, até porque o dialect 3 é mais “moderno” e o recomendado no geral. Perguntei pois tem coisas que não funcionam no dialect 1 mas, se não me engano, envolvem mais os tipos de data e hora (date, time, timestamp).

Seu segundo select está faltando o c.nome no group by, já que você adicionou ele no select:

select p.id_nota, sum(cast(p.valor_pago as numeric)), c.nome from parcelas as p
join nota as n on p.id_nota = n.id_nota
join cliente AS c ON C.id_cliente = N.id_cliente
GROUP BY p.id_nota, c.nome

Fora isso, funcionou no meu teste. Resultado:

image

Para o select acima, ele deveria ter te dado uma mensagem de erro além da Invalid Token, algo como
“Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)”. Isso te informa que faltam campos no seu group by .

Abraço.

No MySql não necessita lista os dois compos no Group By.
MUITO OBRIGADO.

Pode até não ser obrigatório, mas o resultado virá errado né?