Таблица транзакций возврата SQL с датой предыдущего платежа - PullRequest
3 голосов
/ 21 июня 2011

У меня есть запрос в Access, который возвращает транзакции для всех клиентов поля

TransID, TenantID, TransactionType, Amount, TransactionDate

Где TransactionType = 1 для сборов и 2 для платежей

Я хотел бы вернуть все записи этого запроса с дополнительным полем, содержащим предыдущий платеж (TransactionType = 2) TransactionDate для этого клинета (TenantID) В случае отсутствия предыдущего платежа, я хотел бы просто вернуть запись с нулевым значением в качестве даты предыдущей транзакции.

Можете ли вы помочь мне, пожалуйста?

Ответы [ 4 ]

2 голосов
/ 21 июня 2011

Используя подзапрос, передайте дату транзакции внешнего запроса:

SELECT TransID, TenantID, TransactionType, Amount, TransactionDate,
       (SELECT MAX(I.TransactionDate)
        FROM unnamed_table I
        WHERE I.TransactionDate < O.TransactionDate
          AND I.TransactionType = 2
          AND I.TenantID = O.TenantID) PrevTransDate
FROM unnamed_table O
0 голосов
/ 21 июня 2011

Другой метод:

SELECT
    T1.TransID,
    T1.TenantID,
    T1.TransactionType,
    T1.Amount,
    T1.TransactionDate,
    T2.TransactionDate AS PreviousPaymentDate
FROM
    Transactions T1
LEFT OUTER JOIN Transactions T2 ON
    T2.TenantID = T1.TenantID AND
    T2.TransactionType = 2 AND
    T2.TransactionDate < T1.TransactionDate
LEFT OUTER JOIN Transactions T3 ON
    T3.TenantID = T1.TenantID AND
    T3.TransactionType = 2 AND
    T3.TransactionDate < T1.TransactionDate AND
    T3.TransactionDate > T2.TransactionDate
WHERE
    T3.TransID IS NULL AND
    <your normal selection criteria>

По сути, вы получаете последнюю транзакцию (T2), которая относится к типу 2 для того же арендатора, где после этой транзакции не появляется никакой другой транзакции для этого арендатора и того же типа 2 (это то, что делает T3.TransID IS NULL - единственный способ, которым это будет НЕДЕЙСТВИТЕЛЬНО, если не было найдено никакого соответствия). Вы также можете сделать это немного яснее с NOT EXISTS, но производительность часто лучше с двойным LEFT OUTER JOIN. Вот НЕ СУЩЕСТВУЮЩАЯ версия:

SELECT
    T1.TransID,
    T1.TenantID,
    T1.TransactionType,
    T1.Amount,
    T1.TransactionDate,
    T2.TransactionDate AS PreviousPaymentDate
FROM
    Transactions T1
LEFT OUTER JOIN Transactions T2 ON
    T2.TenantID = T1.TenantID AND
    T2.TransactionType = 2 AND
    T2.TransactionDate < T1.TransactionDate
WHERE
    NOT EXISTS (
        SELECT *
        FROM Transactions T3
        WHERE
            T3.TenantID = T2.TenantID AND
            T3.TransactionType = 2 AND
            T3.TransactionDate < T1.TransactionDate AND
            T3.TransactionDate > T1.TransactionDate
        ) AND
    <your normal selection criteria>
0 голосов
/ 21 июня 2011
select t1.TransID, t1.TenantID, t1.TransactionType, t1.Amount, t1.TransactionDate,  max(t2.TransactionDate)
from table as t1 left outer join table as t2 on (t1.TenantID=t2.TenantID)
Where t1.TransactionType =1 and t2.TransactionType =2
and t1.TransactionDate > t2.TransactionDate
0 голосов
/ 21 июня 2011

вам понадобится подзапрос, или вам нужно будет поработать с MAX и строковыми функциями, чтобы добиться большего успеха, чем это в одном запросе, или вам понадобится идентификатор, который уникально идентифицирует предыдущую транзакцию.

select t.*, MAX(prevt.transid) as prev_trans_id
from transactions t 
left join transactions prevt
on t.tenantid=prevt.tenantid 
and t.transid > prevt.transid
group by t.transid
...