Grupo By com Cláusula Where - Firebird

10/07/2020

0

Podem me ajudar , tenho uma query e nela eu faço menção (join ) a três tabelas do meu banco. Só que para concluir minha aplicação vou precisar utilizar uma função de soma (count ) e para isso terei de usar obrigatoriamente o Group By. Mas quando coloca todos os campo (simples) no Group By ele dá erro , pode me ajudar ?

segue minha query ja com o count ...

select
d.id,
count(distinct(d.numero)) As total_acertos,
d.numero,
d.data,
d.tot_dep,
a.data,
case
when (a.tipo = 'V') then 'Vinculado'
else 'Principal'
end as tipo,
a.quantidade,
a.unidade,
a.precounit,
a.precototal,
a.documento,
a.id_motorista,
c.nome,
case
when (c.obs like ('%baú%')) then 'bau'
else 'frota'
end as tipo_mot,
b.id,
b.codigo,
b.descricao,
b.preventiva,
b.pago_motorista

from entdesp a inner join despesas b on a.id_despesa = b.id
inner join motoristas c on a.id_motorista = c.id
inner join acertos d on a.id_motorista = d.id_motorista

where a.data >= '01.06.2020' and a.data <= '30.06.2020'
and d.data >= a.data
and a.id_fornecedor = 2225
and a.id_motorista = 168
and b.codigo in (72,63,48)
Victor Andrade

Victor Andrade

Responder

Post mais votado

15/07/2020

tente assim:
select
    count(distinct(d.numero)) As total_acertos,
    a.data,
    case
        when (a.tipo = 'V') then 'Vinculado'
        else 'Principal'
    end as tipo,
    a.quantidade,
    a.unidade,
    a.precounit,
    a.precototal,
    a.documento,
    a.id_motorista,
    c.nome,
    case
        when (c.obs like ('%baú%')) then 'bau'
        else 'frota'
    end as tipo_mot,
    b.id,
    b.codigo,
    b.descricao,
    b.preventiva,
    b.pago_motorista
from
    entdesp a
inner join
    despesas b on a.id_despesa = b.id
    and b.codigo in (72,63,48)
inner join
    motoristas c on a.id_motorista = c.id
inner join
    acertos d on a.id_motorista = d.id_motorista
    and d.data >= a.data
where
    a.data between '01.06.2020' and '30.06.2020'
    and a.id_fornecedor = 2225
    and a.id_motorista = 168
group by
	a.data,
	a.tipo,
	a.quantidade,
	a.unidade,
	a.precounit,
	a.precototal,
	a.documento,
	a.id_motorista,
	c.nome,
	c.obs,
	b.id,
	b.codigo,
	b.descricao,
	b.preventiva,
	b.pago_motorista

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

14/07/2020

Bruno

Podem me ajudar , tenho uma query e nela eu faço menção (join ) a três tabelas do meu banco. Só que para concluir minha aplicação vou precisar utilizar uma função de soma (count ) e para isso terei de usar obrigatoriamente o Group By. Mas quando coloca todos os campo (simples) no Group By ele dá erro , pode me ajudar ?

segue minha query ja com o count ...

select
d.id,
count(distinct(d.numero)) As total_acertos,
d.numero,
d.data,
d.tot_dep,
a.data,
case
when (a.tipo = 'V') then 'Vinculado'
else 'Principal'
end as tipo,
a.quantidade,
a.unidade,
a.precounit,
a.precototal,
a.documento,
a.id_motorista,
c.nome,
case
when (c.obs like ('%baú%')) then 'bau'
else 'frota'
end as tipo_mot,
b.id,
b.codigo,
b.descricao,
b.preventiva,
b.pago_motorista

from entdesp a inner join despesas b on a.id_despesa = b.id
inner join motoristas c on a.id_motorista = c.id
inner join acertos d on a.id_motorista = d.id_motorista

where a.data >= '01.06.2020' and a.data <= '30.06.2020'
and d.data >= a.data
and a.id_fornecedor = 2225
and a.id_motorista = 168
and b.codigo in (72,63,48)


Seu group by?
Responder

14/07/2020

Emerson Nascimento

tem coisa estranha aí...
você não terá como fazer a conta que precisa, porque está "selecionando" vários campos da tabela d (acertos).
select
	d.id, -- quando colocar este campo no group by, a count() abaixo sempre vai retornar 1 
	count(distinct(d.numero)) As total_acertos,
	d.numero,
	d.data,
	d.tot_dep,
	a.data,
	case
		when (a.tipo = ''V'') then ''Vinculado''
		else ''Principal''
	end as tipo,
	a.quantidade,
	a.unidade,
	a.precounit,
	a.precototal,
	a.documento,
	a.id_motorista,
	c.nome,
	case
		when (c.obs like (''%baú%'')) then ''bau''
		else ''frota''
	end as tipo_mot,
	b.id,
	b.codigo,
	b.descricao,
	b.preventiva,
	b.pago_motorista
from
	entdesp a
inner join
	despesas b on a.id_despesa = b.id
	and b.codigo in (72,63,48)
inner join
	motoristas c on a.id_motorista = c.id
inner join
	acertos d on a.id_motorista = d.id_motorista
	and d.data >= a.data
where
	a.data between ''01.06.2020'' and ''30.06.2020''
	and a.id_fornecedor = 2225
	and a.id_motorista = 168

Responder

15/07/2020

Victor Andrade

Tentei retirar os campos "d" e mesmo assim não retorna..

group by
a.data,
a.quantidade,
a.unidade,
a.precounit,
a.precototal,
a.documento,
a.id_motorista,
c.nome,
b.id,
b.codigo,
b.descricao,
b.preventiva,
b.pago_motorista
Responder

15/07/2020

Victor Andrade

SC ERROR CODE:335544569

ISC ERROR MESSAGE:
Dynamic SQL Error
SQL error code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
Responder

15/07/2020

Bruno

tente assim:
select
    count(distinct(d.numero)) As total_acertos,
    a.data,
    case
        when (a.tipo = 'V') then 'Vinculado'
        else 'Principal'
    end as tipo,
    a.quantidade,
    a.unidade,
    a.precounit,
    a.precototal,
    a.documento,
    a.id_motorista,
    c.nome,
    case
        when (c.obs like ('%baú%')) then 'bau'
        else 'frota'
    end as tipo_mot,
    b.id,
    b.codigo,
    b.descricao,
    b.preventiva,
    b.pago_motorista
from
    entdesp a
inner join
    despesas b on a.id_despesa = b.id
    and b.codigo in (72,63,48)
inner join
    motoristas c on a.id_motorista = c.id
inner join
    acertos d on a.id_motorista = d.id_motorista
    and d.data >= a.data
where
    a.data between '01.06.2020' and '30.06.2020'
    and a.id_fornecedor = 2225
    and a.id_motorista = 168
group by
	a.data,
	a.tipo,
	a.quantidade,
	a.unidade,
	a.precounit,
	a.precototal,
	a.documento,
	a.id_motorista,
	c.nome,
	c.obs,
	b.id,
	b.codigo,
	b.descricao,
	b.preventiva,
	b.pago_motorista


Pelo que vi faltou o c.obs anteriormente creio que a resposta do Emerson esteja correta
Responder

16/07/2020

Victor Andrade

Deu certo !
Muuito Obrigado !!!
Responder

16/07/2020

Victor Andrade

Obrigado Bruno, deu certo !
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar