[firebase-br] Dúvida em SUM() com Group By

Wilson Rosa wsrosa em gmail.com
Ter Abr 10 09:58:56 -03 2012


Marlon,

Como você vai ter que somar mais de uma vez os mesmos campos, você também
pode usar o JOIN ao invés de vários Sub-Selects (código + limpo, + fácil de
dar manutenção, além de + performático):

SELECT
    a.co_associado, a.nu_contrato, a.no_associado,
    a.dt_cadastro, a.dt_adesao, a.dt_reativacao, a.dt_cancelamento,
    SUM(pa.vl_contratado) AS VL_TITULAR,
    SUM(pd.vl_contratado) AS VL_DEPENDENTE,
    ( SUM(pa.vl_contratado)  +  SUM(pd.vl_contratado) ) AS VL_CONTRATO
  FROM TB_ASSOCIADOS a

INNER JOIN TB_PRODUTOS_ASSOCIADOS pa ON (pa.ds_ativo = :ativo AND
pa.co_associado =
a.co_associado)

INNER JOIN TB_PRODUTOS_DEPENDENTES pd ON (pd.ds_ativo = :ativo AND
pd.co_associado =
a.co_associado)

WHERE a.dt_adesao between :dataini and :datafim and a.dt_cancelamento is
null

/* Como o Hélio Oliveira disse, é necessário fazer o agrupamento pelos
outros campos do SELECT */
GROUP BY 1,2,3,4,5,6,7

*ORDER BY a.co_associado*
*
*


Verifique a sua necessidade de trocar o INNER pelo LEFT ou RIGHT, a fim de
trazer os dados mais corretamente.
*
*
*Wilson Rosa*
Desenvolvedor Desk
*wsrosa em gmail.com
*
*
*



Em 10 de abril de 2012 04:41, Marlon ETI <marlon em esferati.com.br> escreveu:

> Boa noite galera!
>
> Tenho a seguinte query:
>
> SELECT
>    a.co_associado, a.nu_contrato, a.no_associado,
>    a.dt_cadastro, a.dt_adesao, a.dt_reativacao, a.dt_cancelamento,
>    (SELECT SUM(pa.vl_contratado) AS VL_TITULAR FROM TB_PRODUTOS_ASSOCIADOS
> pa WHERE pa.ds_ativo = :ativo AND pa.co_associado = a.co_associado) as
> vl_titular,
>    (SELECT SUM(pa.vl_contratado) AS VL_DEPENDENTE FROM
> TB_PRODUTOS_DEPENDENTES pa WHERE pa.ds_ativo =  :ativo AND pa.co_associado
> = a.co_associado) as vl_dependente
>  FROM TB_ASSOCIADOS a
>  WHERE a.dt_adesao between :dataini and :datafim and a.dt_cancelamento is
> null
>
> Onde tenho por retorno
> Código Associado, Número do Contrato, Nome do Associado, Data de Cadastro,
> Data de Adesão, Data de Reativação, Data de Cancelamento, Valor Total dos
> Benefícios do Titular e Valor de Total dos Benefícios do Dependente.
>
> Estou tentando por linda ainda somar o valor total do contrato somando o
> valor total de benefícios do titular + o valor total de benefícios do
> dependente da seguinte forma:
>
> SELECT
>    a.co_associado, a.nu_contrato, a.no_associado,
>    a.dt_cadastro, a.dt_adesao, a.dt_reativacao, a.dt_cancelamento,
>    (SELECT SUM(pa.vl_contratado) AS VL_TITULAR FROM TB_PRODUTOS_ASSOCIADOS
> pa WHERE pa.ds_ativo = :ativo AND pa.co_associado = a.co_associado) as
> vl_titular,
>    (SELECT SUM(pa.vl_contratado) AS VL_DEPENDENTE FROM
> TB_PRODUTOS_DEPENDENTES pa WHERE pa.ds_ativo =  :ativo AND pa.co_associado
> = a.co_associado) as vl_dependente,
>    SUM(
>         (SELECT SUM(pa.vl_contratado) AS VL_TITULAR FROM
> TB_PRODUTOS_ASSOCIADOS pa WHERE pa.ds_ativo = :ativo AND pa.co_associado =
> a.co_associado)
>         +
>         (SELECT SUM(pa.vl_contratado) AS VL_DEPENDENTE FROM
> TB_PRODUTOS_DEPENDENTES pa WHERE pa.ds_ativo =  :ativo AND pa.co_associado
> = a.co_associado)
>       ) AS VL_CONTRATO
>  FROM TB_ASSOCIADOS a
>  WHERE a.dt_adesao between :dataini and :datafim and a.dt_cancelamento is
> null
>  ORDER BY a.co_associado
>
> Porém está dando a seguinte mensagem de erro:
>
> Invalid expression in the select list(not contained in either an aggregate
> function or the GROUP BY clause).
>
> Já tentei agrupar por várias formas e ainda não obtive sucesso.
>
> Alguém teria alguma idéia a respeito para solucionar essa questão???
> Uma vez que o objetivo é gerar uma relatório...
>
> Agradeço a todos desde de já!!!
>
> Abraços :D !!!
>
>
>
> --
> Marlon Conceição
> Analista de Sistemas
> msn : marloncs em live.com
>
> Favor levar em conta o meio-ambiente antes de imprimir este e-mail.
> Por favor tenga en cuenta el medioambiente antes de imprimir este e-mail.
> Please consider your environmental responsibility before printing this
> e-mail.
> ______________________________________________
> 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