[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