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

Kelver Merlotti kmerlotti em gmail.com
Qui Fev 4 08:30:00 -03 2010


Olá Robson, bom dia! Obrigado pela sua atenção.
A questão não é bem essa, pois se você remover o where dos dois SQL's
acontece a mesma coisa: o primeiro roda normal e o segundo não.
Quando fazemos "sum(case when...)", vai na boa.
Agora, quando fazemos "case when (...) then sum() else sum() end", dá
problema sempre, independente do que está no where.
Se fizer o teste vai ver o problema e eu ainda gostaria de entender o porque.
Acho até que já sai, mas queria a opinião da galera.
Estou no aguardo disso.
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 Robson Catunda <robson.catunda em gmail.com>:
> 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
>>
> ______________________________________________
> 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