2015-08-04 5 views
0

У меня проблема в SQL, где все транзакции просто входят в одну гигантскую грязную таблицу.SQL - отключение по умолчанию

Пример:

1 | Invoice | $300 
2 | Invoice | $250 
3 | Payment | $100 
4 | Invoice | $200 
5 | Payment | $300 

Так у меня будет 3 invoices и 2 payments но

Payment в line 3 может стучать только выключить Invoice на line 1 и Payment на line 5 является для Invoice в line 2.

Я хочу Net Off в Payment и найти, а это Overpayment или Underpayment или он сбивая весь счет.

Как я могу это сделать?

+1

Что до пытался до сих пор –

+0

честно, я не знаю, где-нибудь начинается – user3128417

+2

исправить вашу структуру базы данных, Существует никакого способа 100% не будет уверен, что полученный платеж за предыдущий счет-фактура , – ThomasVdBerge

ответ

0

Это легко использовать ROW_NUMBER(). Предположим, что перед оплатой должен быть счет-фактура.

SELECT 
    i.Id AS InvoiceId, p.Id AS PaymentId, 
    CASE 
     WHEN RefAmount = 0 THEN 'Settled' 
     WHEN RefAmount > 0 THEN 'Underpayment' 
     ELSE 'Overpayment' 
    END AS State 
FROM 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY Id) AS GroupId, * 
     FROM messy WHERE Type = 'Invoice' 
    ) i 
    LEFT OUTER JOIN 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY Id) AS GroupId, * 
     FROM messy WHERE Type = 'Payment' 
    ) p ON i.GroupId = p.GroupId 
    CROSS APPLY (SELECT i.Amount - ISNULL(p.Amount, 0) AS RefAmount) r 

SQL Fiddle

Смежные вопросы