[firebase-br] Problema com Select

Forrest® fernando.bg em pop.com.br
Seg Mar 12 22:11:20 -03 2007


Galera é o seguinte, quero em primeira mão pedir desculpas pelo post
grande mas estou com uma duvida e não consigo chegar em uma solução.
Preciso fazer um select que vai me trazer as seguintes informações

data        dia semana   vr. receber   vr. pagar    saldo
01/03/2007  Quinta Feira      100,00       50,00    50,00
02/03/2007  Sexta Feira       120,00       50,00    70,00

E por aí vai, para isso preciso buscar informações em 4 tabelas que tem
mais ou menos essa estrutura.

CONTAS_RECEBER CONTAS_RECEBIDAS CONTAS_PAGAR       CONTAS_PAGAS
______________ ________________ ____________       ____________
TIPO (PK)      TIPO(PK/FK)      COD_FORNECEDOR(PK) COD_FORNECEDOR(PK/FK)
DOCUMENTO(PK)  DOCUMENTO(PK/FK) DOCUMENTO(PK)      DOCUMENTO(PK/FK)
VENCIMENTO     SEQUENCIA(PK)    PARCELA(PK)        PARCELA(PK/FK) 
VALOR_PARCELA  VALOR_RECEBIDO   VENCIMENTO         SEQUENCIA(PK)
                                VALOR_PARCELA      VALOR_PAGO

Pois bem fiz o seguinte Select.

SELECT CR.DATA_VENCIMENTO,
       CASE EXTRACT(WEEKDAY FROM CR.DATA_VENCIMENTO)
          when 0 then 'DOMINGO'
          when 1 then 'SEGUNDA FEIRA'
          when 2 then 'TERÇA FEIRA'
          when 3 then 'QUARTA FEIRA'
          when 4 then 'QUINTA FEIRA'
          when 5 then 'SEXTA FEIRA'
          when 6 then 'SABADO'
       END AS DIASEMANA, 'R' AS TIPO,
       SUM(CR.VALOR_PARCELA) AS VR_TOTAL,
       SUM(CRB.VALOR_RECEBIDO) AS RECEBIDO
FROM CONTAS_RECEBER CR LEFT OUTER JOIN CONTAS_RECEBIDAS CRB ON(
                       (CR.TIPO      = CRB.TIPO) AND
                       (CR.DOCUMENTO = CRB.DOCUMENTO))
GROUP BY 1, 2, 3
HAVING (SUM(CRB.VALOR_RECEBIDO) < SUM(CR.VALOR_PARCELA)) OR
       (SUM(CRB.VALOR_RECEBIDO) IS NULL)
UNION ALL
SELECT CP.VENCIMENTO,
       CASE EXTRACT(WEEKDAY FROM CP.VENCIMENTO)
          when 0 then 'DOMINGO'
          when 1 then 'SEGUNDA FEIRA'
          when 2 then 'TERÇA FEIRA'
          when 3 then 'QUARTA FEIRA'
          when 4 then 'QUINTA FEIRA'
          when 5 then 'SEXTA FEIRA'
          when 6 then 'SABADO'
       END AS DIASEMANA, 'P' AS TIPO,
       SUM(CP.VALOR_PARCELA) AS TOTAL,
       SUM(CPG.VALOR_PAGO) AS RECEBIDO
FROM CONTAS_PAGAR CP LEFT OUTER JOIN CONTAS_PAGAS CPG ON(
                     (CP.COD_FORNECEDOR = CPG.COD_FORNECEDOR) AND
                     (CP.DOCUMENTO      = CPG.DOCUMENTO     ) AND
                     (CP.PARCELA        = CPG.PARCELA       ))
GROUP BY 1,2, 3
HAVING (SUM(CPG.VALOR_PAGO) < SUM(CP.VALOR_PARCELA)) OR
       (SUM(CPG.VALOR_PAGO) IS NULL)
ORDER BY 1, 3 DESC

Ele está praticamente certo, o unico problema é o seguinte, uma conta a
receber pode ter várias baixas como a contas a pagar também, se tiver
apenas uma baixa ou nenhuma corre tudo bem, mas se tiver 2 baixas para
a mesma contas a receber ou pagar o valor da parcela soma quantas baixa
tiver, sei que posso adicionar outro campo para separar por documento e
somar na aplicação, mas gostaria de ver se alguem teria uma solução
para ser feita direto no BD?
Mais uma vez desculpe pelo post extenso, mas não vi uma maneira de
resumir.

T+++++++++++++++++





Mais detalhes sobre a lista de discussão lista