[firebase-br] sum x case..when x null

Alysson Azevedo agalysson em gmail.com
Qui Fev 4 17:39:53 -03 2010


entao, não tenho certeza, por isso desculpe qualquer equivoco...
mas...
olhe a seguinte query

SELECT
 (CASE WHEN
  (TESTVAL1 > 0)
 THEN
  (TESTVAL2 || '-' ||TESTVAL1)
 ELSE
  (TESTVAL2 || '.')
 END)||'@' AS TOTAL
FROM
 TEST
WHERE
 NOT TESTVAL1 IS NULL
GROUP BY
 TESTVAL1,
 TESTVAL2;

*provavelmente*, vira registros com:
1.00.@
1.25.@
5.00.@
10.00.@

repare q o ponto veio antes do @, isso pq sabemos q o que esta dentro de
parenteses é resolvido primeiro...
logo imagino, que se vc der:

 CASE WHEN
  condicao
 THEN
   SUM(TESTVAL2 / TESTVAL1)
primeiro ele soma, depois verifica a condição, no caso, se é > 0...
ja, se vc fizer

SUM(
CASE WHEN
   condicao
  THEN
    TESTVAL2 / TESTVAL1
)
ele vai verificar a condição e depois realizar a soma...

entendeu ?? qq coisa, da o grito
--
Alysson Gonçalves de Azevedo
(11) 8491-7730

    \\   ^__^
      \\ (oo)\_______
        \(__)\             )\/
              ||`~~~~~´||
            _||'          _||


Em 4 de fevereiro de 2010 14:04, Alexandre Sousa
<dave.malkavian em gmail.com>escreveu:

> Não sei se ja mandaram assim, mas acredito que o erro está nos parenteses:
>
> SELECT
>  CASE WHEN
>   (TESTVAL1 > 0)
>
>  THEN
>   SUM(TESTVAL2 / TESTVAL1)
>  ELSE
>   SUM(TESTVAL2)
>  END AS TOTAL
> FROM
>  TEST
> WHERE
>  NOT TESTVAL1 IS NULL
> GROUP BY
>  TESTVAL1,
>  TESTVAL2
>
> Pela sequencia o NOT só estava negando o NULL, não o maior que zero. E
> outra: não precisa verificar se o testval is null, pois no where ja está
> pedindo para trazer só quem tem valor.
>
> []'s
> Alexandre Sousa
>
>
> ----- Original Message ----- From: "Kelver Merlotti" <kmerlotti em gmail.com>
>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Wednesday, February 03, 2010 5:14 PM
> Subject: [firebase-br] sum x case..when x null
>
>
>
> Fala galera, boa tarde!
> Tive de alterar um select aqui no sistema pois estava apresentando
> erro e me surgiu uma dúvida, pois aparentemente a forma como estava
> deveria funcionar.
> Considere a tabela:
>
> CREATE TABLE TEST (
> TESTVAL1 FLOAT,
> TESTVAL2 FLOAT
> );
>
> E os dados:
>
> INSERT INTO TEST (TESTVAL1, TESTVAL2) VALUES (0, 1);
> INSERT INTO TEST (TESTVAL1, TESTVAL2) VALUES (0, 10);
> INSERT INTO TEST (TESTVAL1, TESTVAL2) VALUES (0, 5);
> INSERT INTO TEST (TESTVAL1, TESTVAL2) VALUES (0, 1.25);
> INSERT INTO TEST (TESTVAL1, TESTVAL2) VALUES (0, 5);
> INSERT INTO TEST (TESTVAL1, TESTVAL2) VALUES (NULL, 50);
>
> Observação: Atente-se ao último registro, que tem o TESTVAL1 como NULL!
>
> O seguinte select funciona perfeitamente, sem erro:
>
> SELECT
>  SUM(
>   CASE WHEN
>     NOT TESTVAL1 IS NULL AND
>     TESTVAL1 > 0
>   THEN
>     TESTVAL2 / TESTVAL1
>   ELSE
>     TESTVAL2
>   END) AS TOTAL
> FROM
>  TEST
> WHERE
>  NOT TESTVAL1 IS NULL
> GROUP BY
>  TESTVAL1,
>  TESTVAL2
>
> Agora, este select também não deveria ser executado sem erros?
>
> SELECT
>  CASE WHEN
>   NOT TESTVAL1 IS NULL AND
>   TESTVAL1 > 0
>  THEN
>   SUM(TESTVAL2 / TESTVAL1)
>  ELSE
>   SUM(TESTVAL2)
>  END AS TOTAL
> FROM
>  TEST
> WHERE
>  NOT TESTVAL1 IS NULL
> GROUP BY
>  TESTVAL1,
>  TESTVAL2
>
> O erro é o tradicional "arithmetic overflow or division by zero has
> occurred", bem provavelmente pela tentativa da divisão do TESTVAL2 por
> um TESTVAL1 NULL.
>
> Desde já, obrigado.
> Abraços!
>
> Kelver Merlotti
> Coordenador Editorial do Portal www.ActiveDelphi.com.br
> Contato: kelver em activedelphi.com.br
> Google: kmerlotti em gmail.com
> Twitter: http://twitter.com/kmerlotti
> Tem um segundo? Então, dá uma olhadinha nisso:
> Um site de publicidades, de Portugal, está pagando em euros (quase 3x
> mais que em reais) pra quem estiver disposto a:
> * Ler anúncios
> * Visitar sites
> * Clicar em banners
> * Navegar na NET
> * Ler e-mails
> * Convidar novos usuários
> O pagamento pode ser feito de várias formas!
> Registra lá. Não custa nada!!! ;-)
> http://www.publipt.com/pages/index.php?refid=kmerlotti
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista