Ajuda com select complicado

SQL

IBExpert

Firebird

29/08/2019

Boa tarde a todos e todas, segue abaixo um código sql que está dando erro, alguém pode me ajudar a descobrir o que seja?

select
sum(vi.quantidade) as QtdeQueTem,
aat.Qtdemax as QtdeQuePode,
ia.descricao,
(case
when exists(select 1
from venda_ingresso vi
inner join ingresso as i on i.id = vi.id_venda_ingresso
inner join ingresso_atracoes ia on ia.id = vi.id_atracoes
having ('10:00:00' <= vi.hora_saida
and '12:00:00' >= i.hora_entrada )
and ia.id = 77
and (sum(vi.quantidade) >= aat.Qtdemax)
group by 1
order by 1 )
then 'Horário Ocupado'
else 'Horário Livre'
end) as VerificaPeriodo
from venda_ingresso vi
inner join ingresso as i on i.id = vi.id_venda_ingresso
inner join ingresso_atracoes ia on ia.id = vi.id_atracoes
inner join agrupador_atracoes as aat on aat.id = ia.idagrupador
where ia.id = 77
group by ia.descricao, QtdeQueTem, QtdeQuePode, VerificaPeriodo
order by ia.descricao, QtdeQueTem, QtdeQuePode, VerificaPeriodo


O erro que aparece é no gruop do select que está dentro do case.
Erro:
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 14, column 18.
group.
Fernando Wahl

Fernando Wahl

Curtidas 1

Melhor post

Emerson Nascimento

Emerson Nascimento

29/08/2019

tente assim:
select
	sum(vi.quantidade) as QtdeQueTem,
	aat.Qtdemax as QtdeQuePode,
	ia.descricao,
	case
		when sum(	case
						when '10:00:00' <= vi.hora_saida and '12:00:00' >= i.hora_entrada
						then vi.quantidade
						else 0
					end
				) > aat.Qtdemax
		then 'Horário Ocupado'
		else 'Horário Livre'
	end VerificaPeriodo
from
	venda_ingresso vi
inner join
	ingresso as i on i.id = vi.id_venda_ingresso
inner join
	ingresso_atracoes ia on ia.id = vi.id_atracoes
inner join
	agrupador_atracoes as aat on aat.id = ia.idagrupador
where
	ia.id = 77
group by
	ia.descricao, aat.Qtdemax
order
	by ia.descricao, aat.Qtdemax


ou assim:
SELECT
	*,
	case when QtdSomada >= Qtdemax
		then 'Horário Ocupado'
		else 'Horário Livre'
	end VerificaPeriodo
FROM (
select
	sum(vi.quantidade) as QtdeQueTem,
	aat.Qtdemax as QtdeQuePode,
	ia.descricao,
	sum(	case
				when '10:00:00' <= vi.hora_saida and '12:00:00' >= i.hora_entrada
				then vi.quantidade
				else 0
			end
	) QtdSomada
from
	venda_ingresso vi
inner join
	ingresso as i on i.id = vi.id_venda_ingresso
inner join
	ingresso_atracoes ia on ia.id = vi.id_atracoes
inner join
	agrupador_atracoes as aat on aat.id = ia.idagrupador
where
	ia.id = 77
group by
	ia.descricao, aat.Qtdemax
) A
order by
	descricao, Qtdemax

GOSTEI 2

Mais Respostas

Fernando Wahl

Fernando Wahl

29/08/2019

Bom dia Emerson Nascimento,

Cara, obrigado pelo código que você arrumou, agora vi aonde que estava errando, mas a vida é assim, é errando que se aprende.
Obrigado novamente, só para constatar, o primeiro código que você mandou que deu certo.

O segundo deu um erro, mas o primeiro deu certo, o que fiz apenas foi adicionar a data para verificar se o horário esta livre naquele horário daquele a data determinada pelo usuário.

Grande abraço, caso precise de alguma coisa, estamos sempre por aqui.
Abraços.

GOSTEI 1
POSTAR