Как проверить, равна ли сумма некоторых записей разнице между двумя другими записями в t-sql? - PullRequest
0 голосов
/ 23 марта 2012

У меня есть представление, которое содержит активность банковского счета.

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 = простой порядок возврата записей в порядке начального баланса, активности и конечного баланса

Мне нужно найти способчтобы увидеть, равна ли сумма строк non balance_row разнице между конечным балансом и начальным балансом.Результат для каждой учетной записи (1 для «да», 0 для «нет») будет просто добавлен к результирующему набору результатов.

Пример. У учетной записи 111 было начальное сальдо 0,00.Было две записи активности счета 10.00 и -2.5.Это привело к конечному балансу 7,50.

Я играл с временными столами, но я не был уверен, есть ли более эффективный способ добиться этого.

Спасибо за любыеввод, который вы можете иметь!

Ответы [ 2 ]

1 голос
/ 24 марта 2012

Я бы использовал ранжирование , затем сгруппировал строки по 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 голосов
/ 23 марта 2012

Непроверенный код, но он должен быть очень близок для сравнения итогового баланса с 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
...