select SUM

Firebird

06/08/2008

caros colegas, tenho duas dificuldades com a SQL abaixo:

SELECT SUM(A.VALOR_INSCRICAO) AS INSCRICOES, SUM(B.VALOR_PAGO) AS MENSALIDADES, 
SUM(C.VALOR_PAGO) AS FOLHAPAGTO FROM CLI_PROD A, CLI_FIN B, FUNC_FIN C WHERE
(EXTRACT( MONTH FROM A.DATA_INICIO_FASE) = :Mes) AND (EXTRACT( MONTH FROM B.DATA_PAGTO) = :Mes) 
AND (EXTRACT( MONTH FROM C.DATA_PAGTO) = :Mes) AND B.ID_PAGO = 1


1. como eu faço para que a variavel :Mes nao apareça como 3 parametros no meu SqlDataSet, mas sim apenas uma unica vez?
ex: ´WHERE (A.DATA_INICIO_FASE AND B.DATA_PAGTO AND C.DATA_PAGTO) = :Mes)´
só que com os extract() certinho...

2. po que nao consigo inserir outros campos nessa sql?
ex: ´SELECT A.NOME as NOME, SUM(A.VALOR_INSCRICAO) AS INSCRICOES....´
se eu fizer algo parecido com isso acima, o SqlDataSet me retorna o erro ´Unable to execute query´

conto com vocês...

um forte abraço!


Mahdak

Mahdak

Curtidas 0

Respostas

Thomaz_prg

Thomaz_prg

06/08/2008

1º. Apesar de aparecer 3 vezes o parâmetro, ao passar o valor assim:
ParamByName(´mes´).... o valor seria repassado automaticamente para os parâmetros sem causar problema.

2º. Ao acrescentar outros campos, você deve agrupar os valores por estes campos (group by), para que as funções agregadoras funcionem corretamente.


GOSTEI 0
Mahdak

Mahdak

06/08/2008

1º. Apesar de aparecer 3 vezes o parâmetro, ao passar o valor assim: ParamByName(´mes´).... o valor seria repassado automaticamente para os parâmetros sem causar problema. 2º. Ao acrescentar outros campos, você deve agrupar os valores por estes campos (group by), para que as funções agregadoras funcionem corretamente.



thomaz, valeu por sua ajuda, mas ParamByName(´mes´) é uma propriedade do SqldataSet neh? eu tenho que enviar os valores dos parametros pro ClientDataSet na verdade. então fiz isso(nao sei se é o correto):

DM.cdsBalancoMensal.Close;
DM.cdsBalancoMensal.Params[0].AsString := Edit1.Text;
DM.cdsBalancoMensal.Params[1].AsString := Edit1.Text;
DM.cdsBalancoMensal.Params[2].AsString := Edit1.Text;
DM.cdsBalancoMensal.Open;


outra coisa... nao sei se eu nao entendi muito bem como funciona o select sum, mas alguns valores que estao sendo retornados na consulta nao estao fechando com o que eu tenho no banco.
ex:
- o valor de ´(A.VALOR_INSCRICAO) AS INSCRICOES´ retornado na consulta deveria ser 40 se eu enviasse o parametro ´08´ para o ClientDataSet, mas a consulta me retorna 80, ou seja, ela está dobrando o unico valor existente

- o valor de ´SUM(C.VALOR_PAGO) AS FOLHAPAGTO´ na consulta deveria ser na consulta deveria ser 137,6 se eu enviasse o parametro ´08´ para o ClientDataSet, mas a consulta me retorna 275,2, onde esse ultimo valor corresponde ao mês(parametro) 09 e nao ao mês(parametro) 08.

alguem poderia me dar uma mão nisso?
desde ja obrigado...


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

06/08/2008

SELECT
  SUM(A.VALOR_INSCRICAO) AS INSCRICOES,
  SUM(B.VALOR_PAGO) AS MENSALIDADES,
  SUM(C.VALOR_PAGO) AS FOLHAPAGTO
FROM
  CLI_PROD A
INNER JOIN
  CLI_FIN B ON (EXTRACT(MONTH FROM B.DATA_PAGTO) = EXTRACT(MONTH FROM A.DATA_INICIO_FASE)
    AND EXTRACT(YEAR FROM B.DATA_PAGTO) = EXTRACT(YEAR FROM A.DATA_INICIO_FASE))
INNER JOIN
  FUNC_FIN C ON (EXTRACT(MONTH FROM C.DATA_PAGTO) = EXTRACT(MONTH FROM A.DATA_INICIO_FASE)
    AND EXTRACT(YEAR FROM C.DATA_PAGTO) = EXTRACT(YEAR FROM A.DATA_INICIO_FASE))
WHERE
  EXTRACT(MONTH FROM A.DATA_PAGTO) = :MES
  AND B.ID_PAGO = 1



ou
SELECT SUM(A.VALOR_INSCRICAO) AS INSCRICOES, SUM(B.VALOR_PAGO) AS MENSALIDADES,
SUM(C.VALOR_PAGO) AS FOLHAPAGTO 
FROM CLI_PROD A, CLI_FIN B, FUNC_FIN C
WHERE (EXTRACT( MONTH FROM A.DATA_INICIO_FASE) = :Mes)
AND (EXTRACT( MONTH FROM B.DATA_PAGTO) = :Mes)
AND (EXTRACT( MONTH FROM C.DATA_PAGTO) = :Mes)
AND B.ID_PAGO = 1


passe o valor para o parâmetro assim:
DM.cdsBalancoMensal.Close;
DM.cdsBalancoMensal.Params.ParamByName(´mes´).AsString := Edit1.Text;
DM.cdsBalancoMensal.Open;


o fato de os valores aparecerem duplicados deve ser em função do relacionamento utilizado. tente com subselects:
SELECT
  SUM(VALOR_INSCRICAO) AS INSCRICOES,

  (SELECT SUM(VALOR_PAGO)
   FROM CLI_FIN
   WHERE EXTRACT(MONTH FROM B.DATA_PAGTO) = :MES
   AND ID_PAGO = 1) AS MENSALIDADES,

  (SELECT SUM(VALOR_PAGO)
   FROM FUNC_FIN
   WHERE EXTRACT(MONTH FROM C.DATA_PAGTO) = :MES) AS FOLHAPAGTO
FROM
  CLI_PROD
WHERE EXTRACT(MONTH FROM DATA_INICIO_FASE) = :MES



GOSTEI 0
Thomaz_prg

Thomaz_prg

06/08/2008

De qualquer forma, o ParamByName tb existe para o ClientDataSet.


GOSTEI 0
POSTAR