[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