Grouby by com duas tabelas ?
Esta são as tabelas: Pagar, Receber
com os campo Data_vencimento, valor duplicata, quero um relatório como este :
Valor a Pagar data Vencimento Valor a Receber data Vencimento
R$ 500,00 10/05/2008 R$100,00 10/05/2008
-----------------------------------------------------------------------------
R$ 200,00 12/06/2008
-----------------------------------------------------------------------------
R$ 30,00 13/07/2008 R$ 1.000,00 13/07/2008
-----------------------------------------------------------------------------
R$ 500,00 15/07/2008
-----------------------------------------------------------------------------
R$ 50,00 16/07/2008
----------------------------------------------------------------------------
Se não colocar a clausua where ele repete os a ocorrencia de duplicata ;
Se colocar tem que ter duplicatas a receber e pagar na mesma data para somar caso não exista uma ou outra não aparece na soma
select pagar.datavenc,receber.datavenc, sum(pagar.valordup)valorrc,sum(receber.valordup)valorpg
from pagar, receber where pagar.datavenc = receber.datavenc
group by pagar.datavenc,receber.datavenc
desde já adradeço
Hugo Fabrício
com os campo Data_vencimento, valor duplicata, quero um relatório como este :
Valor a Pagar data Vencimento Valor a Receber data Vencimento
R$ 500,00 10/05/2008 R$100,00 10/05/2008
-----------------------------------------------------------------------------
R$ 200,00 12/06/2008
-----------------------------------------------------------------------------
R$ 30,00 13/07/2008 R$ 1.000,00 13/07/2008
-----------------------------------------------------------------------------
R$ 500,00 15/07/2008
-----------------------------------------------------------------------------
R$ 50,00 16/07/2008
----------------------------------------------------------------------------
Se não colocar a clausua where ele repete os a ocorrencia de duplicata ;
Se colocar tem que ter duplicatas a receber e pagar na mesma data para somar caso não exista uma ou outra não aparece na soma
select pagar.datavenc,receber.datavenc, sum(pagar.valordup)valorrc,sum(receber.valordup)valorpg
from pagar, receber where pagar.datavenc = receber.datavenc
group by pagar.datavenc,receber.datavenc
desde já adradeço
Hugo Fabrício
Hugofab
Curtidas 0
Respostas
Emerson Nascimento
09/05/2008
faça isso num stored procedure:
para usar faça:
select * from RELATORIO_TITULOS
ou
select * from RELATORIO_TITULOS where data between ´01.03.2008´ and ´31.03.2008´
CREATE PROCEDURE RELATORIO_TITULOS returns ( data date, valorpagar double precision, valorreceber double precision) as declare variable datafinal date; declare variable dataaux date; begin /* procuro pela menor e pela maior data de vencimento. note que aqui está simplesmente verificando a menor e a menor data, sem avaliar se o título ainda está em aberto. creio que para um melhor resultado, deveria listar somente os títulos em aberto */ -- obtenho data inicial select min(datavenc) from pagar into :dataaux; select min(datavenc) from receber into :data; if (dataaux < data) then data = dataaux; -- obtenho data final select max(datavenc) from pagar into :dataaux; select max(datavenc) from receber into :datafinal; if (dataaux > datafinal) then datafinal = dataaux; /* com as datas "em mãos", vamos ao relatório */ while (data <= datafinal) do begin -- valor a pagar na data select coalesce(sum(valordup),0) from pagar where datavenc = :data into :valorpagar; -- valor a receber na data select coalesce(sum(valordup),0) from receber where datavenc = :data into :valorreceber; if ((valorpagar > 0) or (valorreceber > 0)) then suspend; data = data + 1; end end
para usar faça:
select * from RELATORIO_TITULOS
ou
select * from RELATORIO_TITULOS where data between ´01.03.2008´ and ´31.03.2008´
GOSTEI 0
Hugofab
09/05/2008
emerson,
executei o exemplo como você me passou mas ele esta travando,
tirei os selecte que seleciona os dados para ver se o while estava gerando loop infinito e notei que mesmo sem selecionar valores ele demora um pouco para retornar mas retorna.
coloquei para filtrar só os titulos em abertos mas mesmo assim travol.
desde já agradeço
Hugo Fabrício
executei o exemplo como você me passou mas ele esta travando,
tirei os selecte que seleciona os dados para ver se o while estava gerando loop infinito e notei que mesmo sem selecionar valores ele demora um pouco para retornar mas retorna.
coloquei para filtrar só os titulos em abertos mas mesmo assim travol.
desde já agradeço
Hugo Fabrício
GOSTEI 0
Emerson Nascimento
09/05/2008
fiz uma pequena alteração:
de qualquer forma, publique a SP alterada por você.
CREATE PROCEDURE RELATORIO_TITULOS returns ( data date, valorpagar double precision, valorreceber double precision) as declare variable datafinal date; declare variable dataauxini date; declare variable dataauxfim date; begin /* procuro pela menor e pela maior data de vencimento. note que aqui está simplesmente verificando a menor e a menor data, sem avaliar se o título ainda está em aberto. creio que para um melhor resultado, deveria listar somente os títulos em aberto */ -- obtenho as datas inicial e final select min(datavenc), max(datavenc) from pagar where [emaberto] into :dataauxini, :dataauxfim; select min(datavenc), max(datavenc) from receber where [emaberto] into :data, datafinal; if (dataauxini < data) then data = dataauxini; if (dataauxfim > datafinal) then datafinal = dataauxfim; /* com as datas "em mãos", vamos ao relatório */ while (data <= datafinal) do begin -- valor a pagar na data select coalesce(sum(valordup),0) from pagar where datavenc = :data and [emaberto] into :valorpagar; -- valor a receber na data select coalesce(sum(valordup),0) from receber where datavenc = :data and [emaberto] into :valorreceber; if ((valorpagar > 0) or (valorreceber > 0)) then suspend; data = data + 1; end end
de qualquer forma, publique a SP alterada por você.
GOSTEI 0
Hugofab
09/05/2008
emerson,
fiz algumas modificações e funcionou,
veja como ficou !
CREATE OR ALTER PROCEDURE RELATORIO_TITULOS (
inicio date,
fim date)
returns (
data date,
valorpagar double precision,
valorreceber double precision)
as
begin
/* com as datas ´em mãos´, vamos ao relatório */
DATA = INICIO;
while (DATA <= FIM) do
begin
-- valor a pagar na data
select coalesce(sum(valordup),0) from contas
where datavenc = :DATA and (Liq = ´N´) into :valorpagar;
-- valor a receber na data
select coalesce(sum(valordup),0) from duplicata
where datavenc = :DATA and (Liq = ´N´) into :valorreceber;
if ((valorpagar > 0) or (valorreceber > 0)) then
suspend;
DATA = DATA + 1;
end
Muito obrigado
Hugo Fabrício
fiz algumas modificações e funcionou,
veja como ficou !
CREATE OR ALTER PROCEDURE RELATORIO_TITULOS (
inicio date,
fim date)
returns (
data date,
valorpagar double precision,
valorreceber double precision)
as
begin
/* com as datas ´em mãos´, vamos ao relatório */
DATA = INICIO;
while (DATA <= FIM) do
begin
-- valor a pagar na data
select coalesce(sum(valordup),0) from contas
where datavenc = :DATA and (Liq = ´N´) into :valorpagar;
-- valor a receber na data
select coalesce(sum(valordup),0) from duplicata
where datavenc = :DATA and (Liq = ´N´) into :valorreceber;
if ((valorpagar > 0) or (valorreceber > 0)) then
suspend;
DATA = DATA + 1;
end
Muito obrigado
Hugo Fabrício
GOSTEI 0