2010-01-22 4 views
3

나는 트랜잭션을 저장하고 계정 잔액을 결정하기 위해 "버킷"방법을 사용하는 레거시 데이터가있는 데이터베이스를 가지고 있습니다. 나는 계정을 위해 만기가 된 연체 될 방법이 필요합니다.SQL 버킷 나이 그룹 결정

표 거래
는 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 내가 별도의 쿼리를 실행하는 등, 각 그룹에 대해 실행하고 다른 사람을 뺀, 충전보다 큰 30,60,90,120에 postdates 제한하지만, 얻을 수없는 시도 $ 0.00 $ 25.00 $ 25.00 $ 0.00

예상 된 결과.

테이블에 지난 기한에 대한 플래그가 저장되지 않고 모든 잔액이 즉시 계산됩니다.

나는 간단한 것을 놓치고 있습니까? net 검색을 시도했지만이 유형의 SQL 쿼리에 대한 용어가 있는지 확실하지 않습니다.

데이터베이스가 도움이되면 데이터베이스입니다.

TIA는

답변

2

당신은 지난 30 일부터 거래를 필터링 할 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 

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 금액에서 차감한다 - 어쩌면 그냥 지난 30 일에 _charges_을 제외? - 그들은 아직 연체되지 않았습니다. –

+0

@martin clayton : "연체 만료"는 아직 지불되지 않은 30 일 이전 요금입니다. 당신은'when' 절을 교환함으로써 SQL에서 그것을 계산할 수 있습니다. 내가 대답을 추가 할께 – Andomar

+0

그렇게 생각하고 좋은 해결책, +1. –

0

이것은 내가 전에에서했다 무언가로 끝났다, 그러나 없어진 것입니다 금액이 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