problema com esta sub consulta
Eu fiz este select com uma subconsulta.
select r.cod_us, r.nome_us,
(select count(r1.cloro_residual) from rede2006 r1
where
r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ AND
r1.recoleta is null and
r1.cod_us=r.cod_us
group by r1.cod_us) as clar1,
(select count(r1.cloro_residual) from rede2006 r1
where r1.cloro_residual BETWEEN 0.2 AND 5 AND
r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ AND
r1.recoleta is null and
r1.cod_us=r.cod_us
group by r1.cod_us) as cldp1,
coalesce((select count(r1.cloro_residual) from rede2006 r1
where r1.cloro_residual < 0.2 [b:0a7d82073d]OR r1.cloro_residual > 5[/b:0a7d82073d] AND
r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ AND
r1.recoleta is null and
r1.cod_us=r.cod_us
group by r1.cod_us),0 ) as clfp1
Perguta:
se eu retirar a clausula ´OR r1.cloro_residual > 5´ ele funciona legal, mas eu quero que ele conte todos os valores <0.2 ou > 5, mas se eu fizer isso me retorna a mensagem de multiplas colunas na consulta.
Tem algum jeito de fazer isso???
select r.cod_us, r.nome_us,
(select count(r1.cloro_residual) from rede2006 r1
where
r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ AND
r1.recoleta is null and
r1.cod_us=r.cod_us
group by r1.cod_us) as clar1,
(select count(r1.cloro_residual) from rede2006 r1
where r1.cloro_residual BETWEEN 0.2 AND 5 AND
r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ AND
r1.recoleta is null and
r1.cod_us=r.cod_us
group by r1.cod_us) as cldp1,
coalesce((select count(r1.cloro_residual) from rede2006 r1
where r1.cloro_residual < 0.2 [b:0a7d82073d]OR r1.cloro_residual > 5[/b:0a7d82073d] AND
r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ AND
r1.recoleta is null and
r1.cod_us=r.cod_us
group by r1.cod_us),0 ) as clfp1
Perguta:
se eu retirar a clausula ´OR r1.cloro_residual > 5´ ele funciona legal, mas eu quero que ele conte todos os valores <0.2 ou > 5, mas se eu fizer isso me retorna a mensagem de multiplas colunas na consulta.
Tem algum jeito de fazer isso???
Admin290
Curtidas 0
Respostas
Emerson Nascimento
25/01/2007
creio que você não precise do [i:ed7e2fcc1c]group by[/i:ed7e2fcc1c] nas subqueries, visto que você está condicionando aquele campo no where. acho que assim funciona:
como você pode ver, a única diferença entre as duas é a ausência do [i:ed7e2fcc1c]group by[/i:ed7e2fcc1c] nas subqueries
select r.cod_us, r.nome_us, (select count(r1.cloro_residual) from rede2006 r1 where r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ AND r1.recoleta is null and r1.cod_us=r.cod_us) as clar1, (select count(r1.cloro_residual) from rede2006 r1 where r1.cloro_residual BETWEEN 0.2 AND 5 AND r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ AND r1.recoleta is null and r1.cod_us=r.cod_us) as cldp1, coalesce( (select count(r1.cloro_residual) from rede2006 r1 where r1.cloro_residual < 0.2 OR r1.cloro_residual > 5 AND r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ AND r1.recoleta is null and r1.cod_us=r.cod_us),0 ) as clfp1
como você pode ver, a única diferença entre as duas é a ausência do [i:ed7e2fcc1c]group by[/i:ed7e2fcc1c] nas subqueries
GOSTEI 0
Admin290
25/01/2007
fiz isso e me da esse erro
ISC ERROR CODE:335544569
ISC ERROR MESSAGE:
Dynamic SQL Error
SQL error code = -104
as approximate floating-point values in SQL dialect 1, but as 64-bit.
ISC ERROR CODE:335544569
ISC ERROR MESSAGE:
Dynamic SQL Error
SQL error code = -104
as approximate floating-point values in SQL dialect 1, but as 64-bit.
GOSTEI 0
Emerson Nascimento
25/01/2007
se vc puder, publique sua consulta completa.
ao que parece não são necessárias tantas subconsultas à mesma tabela.
outra coisa: sempre que solicitar ajuda, informe o SGBD(R) utilizado e a versão do mesmo. assim podemos dar exemplos mais específicos.
ao que parece não são necessárias tantas subconsultas à mesma tabela.
outra coisa: sempre que solicitar ajuda, informe o SGBD(R) utilizado e a versão do mesmo. assim podemos dar exemplos mais específicos.
GOSTEI 0
Admin290
25/01/2007
Firebird 2.0
As consultas estão certa, é isso mesmo, o problema é só no intervalo.
exemplo:
valores de cloro residual
01,02,03,04,05,06,07,08,09,1......5
no between 02 e 5 não tem problema
o q nao consigo fazer é achar em <02 e os >5 excluido os entre 02 e 5.
Eu nao queria fazer outra subquery para fazer separado para somar os <02 com os >5, isto funciona mas deve ter outro jeito.
As consultas estão certa, é isso mesmo, o problema é só no intervalo.
exemplo:
valores de cloro residual
01,02,03,04,05,06,07,08,09,1......5
no between 02 e 5 não tem problema
o q nao consigo fazer é achar em <02 e os >5 excluido os entre 02 e 5.
Eu nao queria fazer outra subquery para fazer separado para somar os <02 com os >5, isto funciona mas deve ter outro jeito.
GOSTEI 0
Emerson Nascimento
25/01/2007
sem o uso de subqueries (o que torna a consulta muito mais rápida):
ou
da forma original:
select r.cod_us, r.nome_us, count(r1.cloro_residual) as clar1, sum( (case when coalesce(r1.cloro_residual,0) BETWEEN 0.2 AND 5 then 1 else 0 end) ) as cldp1, sum( (case when coalesce(r1.cloro_residual,0) < 0.2 or coalesce(r1.cloro_residual,0) > 5 then 1 else 0 end) ) as clfp1 from tabelaprincipal r left join tabelarelacionada r1 on (r1.cod_user = r.cod_us and r1.recoleta is null) where [... AND] r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ group by r.cod_us, r.nome_us
ou
da forma original:
select r.cod_us, r.nome_us, (select count(r1.cloro_residual) from rede2006 r1 where r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ AND r1.recoleta is null and r1.cod_us=r.cod_us) as clar1, (select count(r1.cloro_residual) from rede2006 r1 where r1.cloro_residual BETWEEN 0.2 AND 5 AND r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ AND r1.recoleta is null and r1.cod_us=r.cod_us) as cldp1, coalesce( (select count(r1.cloro_residual) from rede2006 r1 where (r1.cloro_residual < 0.2 OR r1.cloro_residual > 5) AND r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ AND r1.recoleta is null and r1.cod_us=r.cod_us),0 ) as clfp1
GOSTEI 0
Admin290
25/01/2007
Emerson
Testei as suas modificações e nenhuma conseguiu rodar no iboconsole, uma ficou em loop (travou) e outra não reconhece alguns comandos.
Se vc estiver disponivel para ajuda, posso mandar uma copia do banco para vc (bem reduzida) ja que o fdb tem mais de 100000 registros nesta tabela.
Testei as suas modificações e nenhuma conseguiu rodar no iboconsole, uma ficou em loop (travou) e outra não reconhece alguns comandos.
Se vc estiver disponivel para ajuda, posso mandar uma copia do banco para vc (bem reduzida) ja que o fdb tem mais de 100000 registros nesta tabela.
GOSTEI 0
Emerson Nascimento
25/01/2007
pode mandar:
emerson.en@gmail.com
emerson.en@gmail.com
GOSTEI 0
Admin290
25/01/2007
Emerson,
Estive fora do serviço por este periodo, e agora estou voltando, alguma novidade sobre esta consulta???
Estive fora do serviço por este periodo, e agora estou voltando, alguma novidade sobre esta consulta???
GOSTEI 0
Emerson Nascimento
25/01/2007
eu testei essa instrução e aparentemente deu certo:
vale ressaltar que eu criei meu banco de dados com dialeto 3.
select r1.cod_us, count(r1.cloro_residual) as clar1, sum( (case when coalesce(r1.cloro_residual,0) BETWEEN 0.2 AND 5 then 1 else 0 end) ) as cldp1, sum( (case when coalesce(r1.cloro_residual,0) < 0.2 or coalesce(r1.cloro_residual,0) > 5 then 1 else 0 end) ) as clfp1 from rede012006 r1 where (r1.recoleta is null) and r1.cbar_dt_coleta BETWEEN ´2006-01-01´ AND ´2006-01-31´ group by r1.cod_us
vale ressaltar que eu criei meu banco de dados com dialeto 3.
GOSTEI 0
Admin290
25/01/2007
Emerson,
Bah, valeu ja vi q tu é o cara...
Muito Obrigado!!!
Bah, valeu ja vi q tu é o cara...
Muito Obrigado!!!
GOSTEI 0