Eu quero converter o script abaixo para postgresql e minha dificuldade esta em retornar uma tabela com os dados já processados
--Retorna Saldo_inicial,Entrada,Siada e Saldo_final do Mês
declare @idEmpresa int;
set @idEmpresa= '1';
declare @dataInicial datetime, @dataFinal datetime;
set @dataInicial= convert(datetime, '01-11-2017', 103);
set @dataFinal= convert(datetime, '30-11-2017', 103);
set @dataFinal= dateadd(ms, -3, dateadd(day, +1, @dataFinal));
declare @inicioAno datetime;
set @inicioAno= dateadd(year, datediff(year, 0, @dataInicial), 0);
declare @saldoFinal numeric(12,2);
set @saldoFinal= (SELECT sum(case when sit_flcx = 'Entrada' then +val_flcx else -val_flcx end) from tabflcx where emp_flcx = @idEmpresa and data_flcx >= @inicioAno and data_flcx < @dataInicial)
set @saldoFinal = coalesce(@saldoFinal, 0);
declare @MovPeriodo table (dataMov date primary key, sumEntrada numeric(12, 2), sumSaida numeric(12, 2));
INSERT into @MovPeriodo (dataMov, sumEntrada, sumSaida)SELECT cast(data_flcx as date), sum(case when sit_flcx = 'Entrada'
then val_flcx else 0 end), sum(case when sit_flcx = 'Saída' then val_flcx else 0 end) from tabflcx where emp_flcx = @idEmpresa and data_flcx between @dataInicial and @dataFinal group by cast(data_flcx as date);declare @totalEntrada numeric(12, 2), @totalSaida numeric(12, 2);SELECT @totalEntrada= sum(sumEntrada)
,@totalSaida= sum(sumSaida)from @MovPeriodo;set @totalEntrada= coalesce(@totalEntrada, 0);set @totalSaida= coalesce(@totalSaida, 0);with cteDatas as (SELECT cast(@dataInicial as date) as Data union all SELECT dateadd(day, 1, Data) from cteDatas where Data < cast(@dataFinal as date))SELECT [Mes]=
datename(month, D.Data),[Data]= convert(char(10), D.Data, 103), [Saldo_inicial]= @saldoFinal + IsNull((SELECT sum(Mx.sumEntrada - Mx.sumSaida) from @MovPeriodo as Mx where Mx.dataMov < D.Data), 0),[Entrada]= coalesce(M.sumEntrada, 0),[Saida]= coalesce(M.sumSaida, 0), [Saldo_final]= @saldoFinal +
IsNull((SELECT sum(Mz.sumEntrada - Mz.sumSaida) from @MovPeriodo as Mz where Mz.dataMov <= D.Data),0) from cteDatas as D left join @MovPeriodo as M on M.dataMov = D.Data union all SELECT NULL, NULL, NULL, @totalEntrada, @totalSaida, NULL
Eu dividi por etapas e cheguei até agora a este resultado (não satisfatório pois empaquei no retornar a tabela MovPeriodo):
CREATE OR REPLACE FUNCTION SALDO_GERAL() RETURNS
TABLE
(
MES text,
DATA timestamp,
SALDO_INICIAL decimal,
ENTRADA decimal,
SAIDA decimal,
SALDO_FINAL decimal
)
as $$
--Retorna Saldo_inicial,Entrada,Siada e Saldo_final do Mês
/*declare */
idEmpresa int:= '1';
dataInicial timestamp := to_date('01-11-2017','dd/mm/YYYY');
dataFinal timestamp := to_date('30-11-2017','dd/mm/YYYY')-Interval '3 ms'+Interval '1 day';
inicioAno timestamp := to_date('01/01/2017','dd/mm/YYYY');
saldoFinal numeric(12,2):= coalesce((SELECT sum(case when sit_flcx = 'Entrada' then +val_flcx else -val_flcx end) from tabflcx where emp_flcx = idEmpresa and data_flcx >= inicioAno and data_flcx < dataInicial),0);
MovPeriodo record ;
totalEntrada numeric(12, 2);
totalSaida numeric(12, 2);
/*BEGIN*/
SELECT cast(data_flcx as date),
sum(case when sit_flcx = 'Entrada'
then val_flcx else 0 end),
sum(case when sit_flcx = 'Saída'
then val_flcx else 0 end)
/*INTO MovPeriodo*/
from
tabflcx
where
emp_flcx = idEmpresa and
data_flcx between dataInicial and dataFinal
group by
cast(data_flcx as date);
/*END*/
$$ LANGUAGE sql;
SELECT SALDO_GERAL() AS RETORNO;
Pergunta
Glauber M. Silva
Eu quero converter o script abaixo para postgresql e minha dificuldade esta em retornar uma tabela com os dados já processados
--Retorna Saldo_inicial,Entrada,Siada e Saldo_final do Mês declare @idEmpresa int; set @idEmpresa= '1'; declare @dataInicial datetime, @dataFinal datetime; set @dataInicial= convert(datetime, '01-11-2017', 103); set @dataFinal= convert(datetime, '30-11-2017', 103); set @dataFinal= dateadd(ms, -3, dateadd(day, +1, @dataFinal)); declare @inicioAno datetime; set @inicioAno= dateadd(year, datediff(year, 0, @dataInicial), 0); declare @saldoFinal numeric(12,2); set @saldoFinal= (SELECT sum(case when sit_flcx = 'Entrada' then +val_flcx else -val_flcx end) from tabflcx where emp_flcx = @idEmpresa and data_flcx >= @inicioAno and data_flcx < @dataInicial) set @saldoFinal = coalesce(@saldoFinal, 0); declare @MovPeriodo table (dataMov date primary key, sumEntrada numeric(12, 2), sumSaida numeric(12, 2)); INSERT into @MovPeriodo (dataMov, sumEntrada, sumSaida)SELECT cast(data_flcx as date), sum(case when sit_flcx = 'Entrada' then val_flcx else 0 end), sum(case when sit_flcx = 'Saída' then val_flcx else 0 end) from tabflcx where emp_flcx = @idEmpresa and data_flcx between @dataInicial and @dataFinal group by cast(data_flcx as date);declare @totalEntrada numeric(12, 2), @totalSaida numeric(12, 2);SELECT @totalEntrada= sum(sumEntrada) ,@totalSaida= sum(sumSaida)from @MovPeriodo;set @totalEntrada= coalesce(@totalEntrada, 0);set @totalSaida= coalesce(@totalSaida, 0);with cteDatas as (SELECT cast(@dataInicial as date) as Data union all SELECT dateadd(day, 1, Data) from cteDatas where Data < cast(@dataFinal as date))SELECT [Mes]= datename(month, D.Data),[Data]= convert(char(10), D.Data, 103), [Saldo_inicial]= @saldoFinal + IsNull((SELECT sum(Mx.sumEntrada - Mx.sumSaida) from @MovPeriodo as Mx where Mx.dataMov < D.Data), 0),[Entrada]= coalesce(M.sumEntrada, 0),[Saida]= coalesce(M.sumSaida, 0), [Saldo_final]= @saldoFinal + IsNull((SELECT sum(Mz.sumEntrada - Mz.sumSaida) from @MovPeriodo as Mz where Mz.dataMov <= D.Data),0) from cteDatas as D left join @MovPeriodo as M on M.dataMov = D.Data union all SELECT NULL, NULL, NULL, @totalEntrada, @totalSaida, NULL
Eu dividi por etapas e cheguei até agora a este resultado (não satisfatório pois empaquei no retornar a tabela MovPeriodo):
CREATE OR REPLACE FUNCTION SALDO_GERAL() RETURNS TABLE ( MES text, DATA timestamp, SALDO_INICIAL decimal, ENTRADA decimal, SAIDA decimal, SALDO_FINAL decimal ) as $$ --Retorna Saldo_inicial,Entrada,Siada e Saldo_final do Mês /*declare */ idEmpresa int:= '1'; dataInicial timestamp := to_date('01-11-2017','dd/mm/YYYY'); dataFinal timestamp := to_date('30-11-2017','dd/mm/YYYY')-Interval '3 ms'+Interval '1 day'; inicioAno timestamp := to_date('01/01/2017','dd/mm/YYYY'); saldoFinal numeric(12,2):= coalesce((SELECT sum(case when sit_flcx = 'Entrada' then +val_flcx else -val_flcx end) from tabflcx where emp_flcx = idEmpresa and data_flcx >= inicioAno and data_flcx < dataInicial),0); MovPeriodo record ; totalEntrada numeric(12, 2); totalSaida numeric(12, 2); /*BEGIN*/ SELECT cast(data_flcx as date), sum(case when sit_flcx = 'Entrada' then val_flcx else 0 end), sum(case when sit_flcx = 'Saída' then val_flcx else 0 end) /*INTO MovPeriodo*/ from tabflcx where emp_flcx = idEmpresa and data_flcx between dataInicial and dataFinal group by cast(data_flcx as date); /*END*/ $$ LANGUAGE sql; SELECT SALDO_GERAL() AS RETORNO;
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.