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

Kelver Merlotti kmerlotti em gmail.com
Qua Fev 3 17:14:53 -03 2010


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




Mais detalhes sobre a lista de discussão lista