2012-03-23 38 views
0

我有一個包含銀行賬戶活動的視圖。如何檢查一些記錄的總和是否等於t-sql中兩個其他記錄的差異?

ACCOUNT BALANCE_ROW AMOUNT SORT_ORDER 
111   1   0.00  1 
111   0   10.00  2 
111   0   -2.50  3 
111   1   7.50  4 
222   1   100.00  5 
222   0   25.00  6 
222   1   125.00  7 
  • ACCOUNT =帳號
  • BALANCE_ROW =要麼開始或結束 平衡將是1,否則爲0
  • AMOUNT =量
  • SORT_ORDER = 簡單爲了返回記錄在起始餘額的順序, 活動和期末餘額

我需要找出一種方法來查看非balance_row行的總和是否等於期末餘額和起始餘額之間的差額。每個帳戶的結果(1代表是,0代表否)將被簡單地添加到結果集中。

例如: 帳戶111的起始餘額爲0.00。有兩個帳戶活動記錄10.00和-2.5。這導致了7.50的期末餘額。

我一直在玩臨時表,但我不確定是否有更高效的方法來完成此操作。

感謝您的任何意見!

回答

0

未經測試的代碼,但應該非常接近,用於將總結餘額與balance_row進行比較,如您在問題中所定義的。

SELECT 
    Account, /* Account Number */ 
    (select sum(B.amount) from yourview B 
     where B.balance_row = 0 and 
     B.account = A.account and 
     B.sort_order BETWEEN A.sort_order and 
      (select max(sort_order) /* previous sort order value on account */ 
      from yourview C where 
      C.balance_row = 1 and 
      C.account = A.account and 
      C.sort_order < A.sort_order) 
    ) AS Test_Balance, /* Test_Balance = sum of amounts since last balance row */ 
    Balance_Row /* Value of balance row */ 
FROM yourview A 
WHERE A.Balance_Row = 1 
1

我會沿途使用ranking,然後組行由ACCOUNT計算總計:

; 
WITH ranked AS (
    SELECT 
    *, 
    rnk = ROW_NUMBER() OVER (PARTITION BY ACCOUNT ORDER BY SORT_ORDER) 
    FROM data 
), 
grouped AS (
    SELECT 
    ACCOUNT, 
    BALANCE_DIFF = SUM(CASE BALANCE_ROW WHEN 1 THEN AMOUNT END 
        * CASE rnk WHEN 1 THEN -1 ELSE 1 END), 
    ACTIVITY_SUM = SUM(CASE BALANCE_ROW WHEN 0 THEN AMOUNT ELSE 0 END) 
    FROM data 
    GROUP BY 
    ACCOUNT 
) 
SELECT * 
FROM grouped 
WHERE BALANCE_DIFF <> ACTIVITY_SUM 

排名僅此用來更容易地計算開始/結束平衡差。例如,如果起始和結束餘額行有不同的BALANCE_ROW代碼(例如起始餘額爲1,最後一個爲2),則可以避免排名。

+0

不錯的做法,允許您只選擇總和行值不同的那些行。 +1爲高雅:) – RThomas 2012-03-26 06:17:59

相關問題