[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