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

Robson Catunda robson.catunda em gmail.com
Qui Fev 4 01:24:35 -03 2010


O Sum( ) faz uma varredura geral. Pega todos os registros.
Mas experimente incluir a condição de TESTVAL1 > 0 na clausura where.

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



Mais detalhes sobre a lista de discussão lista