2010-01-22 82 views
3

我有一個數據庫,其中包含存儲事務的舊數據,並使用「桶」方法確定帳戶餘額。我需要一種讓賬戶過期的方法。SQL Buckets確定年齡分組

內幕交易
TRANSACTIONID
TRANSACTIONTYPE(CHARGE,收據)
金額

爲了得到當前餘額:

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

我需要一種方法來確定逾期30, 60,90,120等:

賬戶C urrent 30 60 90 120+
12345 $ $ 50.00 $ 0.00 $ 25.00 $ 25.00 0.00包裝

我試圖運行單獨的查詢,並限制充電晚於大於30,60,90,120,運行各組減去別人等,但不能得到預期的結果。

該表不存儲過期到期的標誌,所有餘額都是即時計算的。

我是否缺少一些簡單的東西?我嘗試了一個網絡搜索,但不知道是否有這種類型的SQL查詢的術語。

數據庫是SQL Server,如果有幫助。

TIA

回答

2

你可以使用一個額外的條款在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

@Andomar - 最近抵達收益(即在過去30天)應從PastDue30量減去 - 也許只是排除_charges_在過去30天呢? - 他們還沒有逾期。 – 2010-01-22 23:22:28

+0

@馬丁·克萊頓:那麼「過期」是真的從30天的收費尚未支付?你可以通過交換'when'子句來計算SQL。我會將其添加到答案 – Andomar 2010-01-22 23:30:20

+0

認爲是這樣,而不錯的解決方案,+1。 – 2010-01-22 23:32:54

0

這是我結束了,這東西我從以前有,但失蹤檢查到期金額何時爲零,以及檢查前一組是否爲負值。我不得不補充他們,因爲我得到了奇怪的結果,說如果這個帳戶對於一個服務來說是多付的,而這個服務在前一個期間會有負值。

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