SQL Buckets Определение возрастной группировки - PullRequest
3 голосов
/ 23 января 2010

У меня есть база данных с устаревшими данными, в которой хранятся транзакции и используется метод «корзины» для определения остатков на счетах. Мне нужен способ просрочить счета для счетов.

Таблица транзакций
TransactionID
TransactionType (CHARGE, RECEIPT)
Сумма
Постдатировать

Чтобы получить текущий баланс:

SELECT SUM(CASE TransactionTypeId WHEN RECEIPT THEN Amount * -1 ELSE Amount END) CurrentBalance

Мне нужен способ определить просрочку 30, 60, 90, 120 и т. Д .:

Текущий счет 30 60 90 120 +
12345 $ 50,00 $ 0,00 $ 25,00 $ 25,00 $ 0,00

Я попытался выполнить отдельные запросы и ограничить количество дат CHARGE более 30,60,90,120, запустить для каждой группы, вычесть другие и т. Д., Но не смог получить ожидаемых результатов.

В таблице не хранится флаг просроченных платежей, все балансы рассчитываются на лету.

Я что-то упустил? Я пробовал поиск в сети, но не уверен, есть ли термин для этого типа SQL-запроса.

База данных - это SQL Server, если это помогает.

ТИА

Ответы [ 2 ]

3 голосов
/ 23 января 2010

Вы можете использовать дополнительное условие в case, чтобы отфильтровать транзакции за последние 30 дней. Например:

SELECT 
    SUM(
        CASE WHEN TransactionTypeId = 'RECEIPT' THEN -Amount 
             ELSE Amount 
    END) as CurrentDue
,   SUM(CASE WHEN datediff(d,PostDate,getdate()) <= 30 THEN 0
             WHEN TransactionTypeId = 'RECEIPT' THEN -Amount 
             ELSE Amount 
    END) as PastDue30
,   ...
FROM Transactions

Чтобы исключить расходы за последние 30 дней, поменяйте местами пункты when:

,   SUM(CASE WHEN TransactionTypeId = 'RECEIPT' THEN -Amount 
             WHEN datediff(d,PostDate,getdate()) <= 30 THEN 0
             ELSE Amount 
    END) as PastDue30
0 голосов
/ 24 января 2010

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

SELECT
ServiceId,
AmountDue PastDue,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue60 &lt; 0 THEN 0 ELSE AmountDue30 - AmountDue60 END END PastDue30,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue90 &lt; 0 THEN 0 ELSE AmountDue60 - AmountDue90 END END PastDue60,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue120 &lt; 0 THEN 0 ELSE AmountDue90 - AmountDue120 END END PastDue90,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue120 &lt; 0 THEN 0 ELSE AmountDue120 END END PastDue120
FROM
(
    SELECT T.ServiceId,
    SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN T.TAmount ELSE 0 END) AmountDue,
    SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, @TPostDate) &gt;=  30 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue30,
    SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, @TPostDate) &gt;=  60 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue60,
    SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, @TPostDate) &gt;=  90 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue90,
    SUM(CASE WHEN T.TransactionTypeId = @Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = @Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, @TPostDate) &gt;= 120 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue120
    FROM Transactions T
    WHERE T.AccountId = @AccountId
    GROUP BY T.ServiceId
) AB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...