Ola Emerson, muito obrigado pela ajuda...

Trabalhando aqui, cheguei no seguinte SELECT:

select
  a.data_ven,
  a.cod_his,
  b.descricao as historico,
  -coalesce(sum(c.val_doc), 0) as a_pagar,
  coalesce(sum(d.val_doc), 0) as a_receber,
  a.c
from mv_contas_pagrec a
inner join mv_historicos b on(b.cod_his = a.cod_his)
left join mv_contas_pagrec c on(c.cod_key = a.cod_key)and(c.c = 'P')
left join mv_contas_pagrec d on(d.cod_key = a.cod_key)and(d.c = 'R')
where (a.obs not in('C'))
  and(a.data_ven between '01/01/2013' and '31/01/2013')
  and(a.data_qui is null)
group by
  a.data_ven, b.descricao,
  a.c,
  a.cod_his
order by
  a.data_ven, b.descricao


Onde
"-coalesce" é para transformar o contas a pagar em negativo pra hora do
calculo
"P" = A Pagar
"R" = Receber
"cod_key" = é a chave unica da tabela (que sempre crio em minhas tabelas)

Bem pelo que analisei aqui parece estar tudo batendo, mas como não sou
especialista :) sempre fica aquela pulguinha "né" :)
Então gostaria de uma aval do colegas se este select está correto ou teria
alguma ressalva pra eu me precaver de futuras inconsistências nos saldos.


Mais uma vez obrigado...


Marcelo Silva
--------------------------------------




Em 26 de fevereiro de 2013 11:42, Emerson Hermann
<[email protected]>escreveu:

> Marcelo,
>
> Não sei se ajuda, mas peguei esse script de aulas que ministro sobre
> BD, veja se atente  a estrutura mostra uma tabela de emprestimo de
> colaboradores que é semelhante a sua estrutura de extrato.
>
> Segue script:
>
> -- ddl
> --DROP TABLE emprestimo_colaborador;
> CREATE TABLE emprestimo_colaborador
> (
>  id_emprestimo_colaborador bigint
> , id_colaborador            bigint        NOT NULL
>     , dt_lancamento             date          NOT NULL
> , tipo_lancamento           varchar(1)    NOT NULL
>     , vlr_lancamento            numeric(14,2) NOT NULL
>     , CONSTRAINT pk_emprestimo_colaborador_id_ec PRIMARY KEY
> (id_emprestimo_colaborador)
> );
>
>
> --dml
>
> -- efetuando lancamentos relativo a  emprestimo colaborador
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (1,2,'2012-03-10','C', 50.00);
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (2,2,'2012-03-25','C',150.00);
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (3,2,'2012-04-05','D',-50.00);
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (4,2,'2012-05-05','D',-50.00);
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (5,2,'2012-06-05','D',-50.00);
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (6,2,'2012-06-08','C',100.00);
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (7,2,'2012-06-12','C',100.00);
>
> -- efetuando lancamento relativo a emprestimo colaborador 2
>
> -- efetuando lancamentos relativo a  emprestimo colaborador
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (8,2,'2012-03-10','C', 50.00);
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (9,2,'2012-03-25','C',150.00);
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (10,2,'2012-04-05','D', 50.00);
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (11,2,'2012-05-05','D', 50.00);
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (12,2,'2012-06-05','D', 50.00);
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (13,2,'2012-06-08','C',100.00);
> INSERT INTO emprestimo_colaborador (id_emprestimo_colaborador,
> id_colaborador, dt_lancamento, tipo_lancamento, vlr_lancamento) VALUES
> (14,2,'2012-06-12','C',100.00);
>
> -- TRUNCATE TABLE emprestimo_colaborador;
> --dql
>
> -- listando emprestimo
>
> SELECT *
>  FROM emprestimo_colaborador
>     ;
>
> -- listando saldo, com coluna informando débito e crédito, detalhado,
> com acompanhamento do saldo, forma 01
>
>    SELECT id_colaborador
>         , dt_lancamento
> , tipo_lancamento
> , vlr_lancamento
> ,
> (
>  SELECT sum
>       (
>    CASE WHEN tipo_lancamento = 'D' THEN
> vlr_lancamento * -1
>                      WHEN tipo_lancamento = 'C' THEN
> vlr_lancamento
>     ELSE
> 0.00
>    END
>   )
>        FROM emprestimo_colaborador
>   WHERE dt_lancamento <= ec.dt_lancamento
>     AND id_colaborador = 2
> )  AS saldo
> FROM emprestimo_colaborador AS ec
>  ORDER BY dt_lancamento
>    ;
>
>
> -- listando saldo, com coluna informando débito e crédito, detalhado,
> com acompanhamento do saldo, com mais detalhes forma 02
>
>    SELECT id_colaborador
>         , dt_lancamento
> , tipo_lancamento
> , CASE WHEN tipo_lancamento = 'C' THEN
> vlr_lancamento
>       ELSE
>    0.00
>  END AS credito
> , CASE WHEN tipo_lancamento = 'D' THEN
> vlr_lancamento
>       ELSE
>    0.00
>  END AS debito
> ,
> (
>  SELECT sum
>       (
>    CASE WHEN tipo_lancamento = 'D' THEN
> vlr_lancamento * -1
>                      WHEN tipo_lancamento = 'C' THEN
> vlr_lancamento
>     ELSE
> 0.00
>    END
>   )
>        FROM emprestimo_colaborador
>   WHERE dt_lancamento <= ec.dt_lancamento
>     AND id_colaborador = 2
> )  AS saldo
> FROM emprestimo_colaborador AS ec
>  ORDER BY ec.dt_lancamento
>    ;
>
> No script acima vc pode mudar o campo date para timestamp.
>
> Espero ter ajudado.
>
>
>
> Em 26 de fevereiro de 2013 09:14, José Mello Júnior
> <[email protected]> escreveu:
> > Utilizando o Case e functions window para demonstrar o saldo, nem há
> > necessidade de qualquer outra coisa.
> >
> > Att
> >
> > Em 26 de fevereiro de 2013 08:27, Ricardo Carlini Sperandio
> > <[email protected]> escreveu:
> >
> >> Enviado pelo Motorola Razr
> >> Em 25/02/2013 23:50, "Eduardo Almeida" <[email protected]>
> >> escreveu:
> >>
> >>
> >> >
> >> > tente algo como
> >> >
> >> > SELECT
> >> >         ( CASE WHEN ( flag = 'credito' ) THEN total ELSE 0 END) AS
> >> > receitas,
> >> >         ( CASE WHEN ( flag = 'debito' )  THEN total ELSE 0 END) AS
> >> > despesas
> >> >         FROM tbl_tabela
> >> >         WHERE flag IN ('credito', 'debito') ;
> >> >
> >> >
> >> >
> >> >
> >> > On 25/02/2013 23:30, Marcelo Silva wrote:
> >> >>
> >> >>
> >> >>
> >> >> From: Eduardo Almeida
> >> >> Sent: Monday, February 25, 2013 11:20 PM
> >> >> To: Comunidade PostgreSQL Brasileira
> >> >> Subject: Re: [pgbr-geral] SQL Para extrato de C/C
> >> >>
> >> >> On 25/02/2013 16:19, Marcelo da Silva wrote:
> >> >>>
> >> >>> Pessoal, tenho um duvida simples porem gostaria da opinião dos
> >> >>> amigos...
> >> >>> Preciso montar um extrato estilo do banco Itau, mais ou menos assim
> >> >>>
> >> >>> Historico     A Pagar     A Receber    Diferença        Saldo
> >> >>> teste1            0,00           10,00           10,00
>  10,00
> >> >>> teste2         -25,00           20,00            -5,00
> 5,00
> >> >>> ...
> >> >>>
> >> >>> Bem... como uso uma tabela só para guardar contas a pagar e
> receber, é
> >> >>> simples pegar Debitos e Creditos,
> >> >>> mas o resultado sai em um unica coluna, gostaria de ter o layout
> >> >>> acima...
> >> >>> Será que é possivel fazer no SQL ou terei que montar o relatorio na
> >> >>> mão?
> >> >>>
> >> >>> O que tenho hoje é assim:
> >> >>>
> >> >>> teste 1    0,00
> >> >>> teste 1  10,00
> >> >>> teste 2  -25,00
> >> >>> teste 2   20,00
> >> >>> ...
> >> >>
> >> >>
> >> >> E como você sabe o que é a pagar e o que é a receber?
> >> >>
> >> >>
> >> >> Tem um Flag P/R (Pagar / Receber) na tabela
> >> >>>
> >> >>>
> >> >>> Estive pensando em Union mas pelo que vejo não é isso...
> >> >>> Com crossover de tabelas tambem não consegui chegar num resultado
> >> >>> esperado
> >> >>>
> >> >>> :(
> >> >>>
> >> >>>
> >> >>> Marcelo Silva
> >> >>> ----------------------------------
> >> >>>
> >> >>>
> >> >>>
> >> >>> _______________________________________________
> >> >>> pgbr-geral mailing list
> >> >>> [email protected]
> >> >>>
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
> >> >>
> >> >>
> >> >>
> >> >> --
> >> >> Eduardo Almeida - Software Engineer
> >> >> [email protected] - 27 3021-2430 / 27 9839 3755
> >> >>
> >> >> WEB2 Solutions - Inovando, sempre!
> >> >>
> >> >> ________________________________
> >> >> _______________________________________________
> >> >> pgbr-geral mailing list
> >> >> [email protected]
> >> >> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
> >> >>
> >> >>
> >> >> _______________________________________________
> >> >> pgbr-geral mailing list
> >> >> [email protected]
> >> >> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
> >> >
> >> >
> >> >
> >> > --
> >> > Eduardo Almeida - Software Engineer
> >> > [email protected] - 27 3021-2430 / 27 9839 3755
> >> >
> >> > WEB2 Solutions - Inovando, sempre!
> >> >
> >> > _______________________________________________
> >> > pgbr-geral mailing list
> >> > [email protected]
> >> > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
> >> >
> >> Eu fiz algo parecido para o sistema de controle do nosso campeonato de
> >> kart.
> >> A melhor forma que encontrei foi usando uma storage procedure. Que pode
> >> tanto devolver o resultado diretamente quanto alimentar uma tabela.
> >>
> >>
> >> _______________________________________________
> >> pgbr-geral mailing list
> >> [email protected]
> >> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
> >>
> >
> >
> >
> > --
> > Mello Júnior
> > 41.3252-3555
> >
> > _______________________________________________
> > pgbr-geral mailing list
> > [email protected]
> > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
> >
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a