select SUM
caros colegas, tenho duas dificuldades com a SQL abaixo:
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!
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
Curtidas 0
Respostas
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.
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
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
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
06/08/2008
De qualquer forma, o ParamByName tb existe para o ClientDataSet.
GOSTEI 0