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

Kelver Merlotti kmerlotti em gmail.com
Qui Fev 4 13:51:14 -03 2010


Boa tarde galera!

Nivaldo, certamente o erro da divisão por zero é natural, por isso que
utilizei o case..when para tratar que, quando seja zero, não faça a
divisão, somente some o campo2, certo?

E se eu colocar o TESTVAL1 > 0 no where, também não dá erro, mas não
me apresenta os dados! E não é isso que eu preciso. Preciso que os
dados apareçam independente se está null ou zero, entretanto, quando
não for > 0, que não faça a divisão, mas faça a soma.

Alysson, o seu exemplo também não atende a necessidade, que é somar o
campo TESTVAL2 caso TESTVAL1 seja 0, ou somar o TESTVAL2 dividido pelo
TESTVAL1 caso TESTEVAL1 seja maior que 0.

De qualquer forma, obrigado a todos pela atenção e, caso alguém saiba
explicar porque o select 1 vai e o 2 não, agradeço, pois quero saber
se minha suspeita está correta.

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



2010/2/4 Alysson Azevedo <agalysson em gmail.com>:
> Não sei se entendi direito mas se ele apenas colocar a condição > 0, alguns
> valores não virão mais...
> por isso, experimenta:
>
> SELECT (TESTVAL2) AS TOTAL
> FROM TEST WHERE TESTVAL1 = 0 or TESTVAL1 is null
> GROUP BY TESTVAL1, TESTVAL2
> UNION
> SELECT (TESTVAL2 / TESTVAL1) AS TOTAL
> FROM TEST WHERE TESTVAL1 > 0
> GROUP BY TESTVAL1, TESTVAL2;
>
> --
> Alysson Gonçalves de Azevedo
> (11) 8491-7730
>
>    \\   ^__^
>      \\ (oo)\_______
>        \(__)\             )\/
>              ||`~~~~~´||
>            _||'          _||
>
>
> Em 4 de fevereiro de 2010 09:21, Nivaldo Martins
> <nivaldomart em gmail.com>escreveu:
>
>> Olá Klever,
>>
>> O erro é natural. No segundo código você coloca "TESTVAL2/TESTVAL1"
>>
>> Testval1 é zero em todos os registros que vc inseriu. Realmente como o
>> colega robson colocou se vc adicionar testval 1 > 0 na clausula where do
>> segundo código o erro não acontecerá.
>>
>>
>>
>>
>> Em 3 de fevereiro de 2010 16:14, Kelver Merlotti <kmerlotti em gmail.com
>> >escreveu:
>>
>> > 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<
>> http://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
>>
> ______________________________________________
> 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