[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