Fórum select SUM #60086

06/08/2008

0

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

Responder

Posts

06/08/2008

Thomaz_prg

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.


Responder

Gostei + 0

08/08/2008

Mahdak

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...


Responder

Gostei + 0

08/08/2008

Emerson Nascimento

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



Responder

Gostei + 0

08/08/2008

Thomaz_prg

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar