GARANTIR DESCONTO

Fórum problema com esta sub consulta #57776

25/01/2007

0

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???


Admin290

Admin290

Responder

Posts

25/01/2007

Emerson Nascimento

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:
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


Responder

Gostei + 0

26/01/2007

Admin290

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.


Responder

Gostei + 0

26/01/2007

Emerson Nascimento

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.


Responder

Gostei + 0

26/01/2007

Admin290

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.


Responder

Gostei + 0

26/01/2007

Emerson Nascimento

sem o uso de subqueries (o que torna a consulta muito mais rápida):
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



Responder

Gostei + 0

29/01/2007

Admin290

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.


Responder

Gostei + 0

29/01/2007

Emerson Nascimento

pode mandar:
emerson.en@gmail.com


Responder

Gostei + 0

12/02/2007

Admin290

Emerson,

Estive fora do serviço por este periodo, e agora estou voltando, alguma novidade sobre esta consulta???


Responder

Gostei + 0

12/02/2007

Emerson Nascimento

eu testei essa instrução e aparentemente deu certo:
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.


Responder

Gostei + 0

13/02/2007

Admin290

Emerson,

Bah, valeu ja vi q tu é o cara...

Muito Obrigado!!!


Responder

Gostei + 0

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

Aceitar