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

Alysson Azevedo agalysson em gmail.com
Qui Fev 4 09:47:42 -03 2010


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
>



Mais detalhes sobre a lista de discussão lista