Group By no firebird

Como eu consigo agrupar colunas usando o firebird ?

Esse select não funciona no firebird:

Select SUM(sexo) as teste, idade, nome, numero from pessoas group by idade;

Eu quero agrupar, mas não agrupa pela colunada selecionada, no mysql eu coloco “group by NomeColuna” e ele agrupa.

Como o select acima ficaria para agrupar por idade no firebird ??

Igor,

Tente assim:

Select SUM(sexo) as teste, idade, nome, numero from pessoas group by idade order by idade, nome, numero
1 curtida

Glauco,
dá esse erro :
-Invalid expression in the select list (not contained in either an aggregate fun
ction or the GROUP BY clause)

o que está difícil entrar na minha cabeça é o porque que pessoas colocam mais de uma coluna no group by e no order by , o MySql eu sempre uso apenas uma coluna, Estou há dias tentando agrupar no firebird.

Se estás a agrupar por idade, não podes ter nome e numero no teu select. Ou agrupas também por esses campos ou tiras do select.

1 curtida

Não precisava criar outro tópico. Se precisa de mais esclarecimentos, pode continuar perguntando nesse.

Como você já deve ter percebido, no Firebird o comportamento é diferente.

Para quem quiser ver como fica no MySQL, clique aqui: http://sqlfiddle.com/#!9/90d0bb/2 (é o mesmo da imagem abaixo):

É esse o resultado que você quer?

Abraço.

1 curtida

O resultado que quero é exatamente esse, mas esse select não roda no firebird.
Queria um select do firebird que tivesse o mesmo resultado do MySql.

Quero o mesmo resultado no firebird que é possível no Mysql usando: select nome, sexo, idade from teste group by idade;

Já estou há dias tentando, não abandonem esse tópico.

Nem faz sentido funcionar. Qual o critério para aparecer ali João e não José ou Carlos? Qualquer dos 3 seria válido de aparecer ali.

Parece uma sintaxe especial do MySQL, que pega o primeiro registro referente ao campo agrupado (idade, nesse caso). Eu realmente não esperaria que isso funcionasse, e também não faz muito sentido pra mim. Mas, enfim… :sweat_smile:

De qualquer forma, no Firebird dá pra fazer algo assim:

select 
(select first 1 b.nome from teste b where b.idade = a.idade) as nome,
(select first 1 c.sexo from teste c where c.idade = a.idade) as sexo,
a.idade
from teste a
group by a.idade

Pode ser que haja uma sintaxe melhor ou alguma função que faça isso, mas eu particularmente não conheço. Order by pode ser necessário para determinar qual registro retornar, mas fiz sem e obtive o mesmo resultado.

Abraços.

2 curtidas

Estou até agora tentando entender qual a sua necessidade e não cheguei numa conclusão.

Você quer saber a quantidade de pessoas por sexo?
Você quer saber a quantidade de pessoas por idade?

Explica melhor o que você realmente deseja fazer.

1 curtida

Jonas.cant,
Minha necessidade não é pra esse select, esse é um exemplo, mas se conseguir com esse eu consigo no outro, coloquei um simples pra ficar mais fácil de eu enteder.

TerraSkilll,
Vou testar com esse e posto o resultado.

Faça o seguinte teste:

Select SUM(sexo) as teste, MAX(idade), nome, MAX(numero) from pessoas group by nome;

Depois esse:

Select SUM(sexo) as teste, idade, nome, numero from pessoas group by idade, nome, numero;

1 curtida

Usando o MAX( ) funcionou perfeitamente.
Mas fiquei com uma dúvida, como o MAX retorna o maior valor, pode acontecer de algumas linhas ser descartadas do select ?

A soma funcionará normalmente, nenhum registro será descartado até onde sei. Só testando para ver.

1 curtida