Tsql 在t-sql中,如何检查某些记录的总和是否等于其他两条记录之间的差值?
我有一个包含银行帐户活动的视图Tsql 在t-sql中,如何检查某些记录的总和是否等于其他两条记录之间的差值?,tsql,sql-server-2005,sum,temp-tables,Tsql,Sql Server 2005,Sum,Temp Tables,我有一个包含银行帐户活动的视图 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
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
账户=账号
余额行=开始或结束
余额应为1,否则为0
金额=金额
排序=
按开始余额顺序返回记录的简单顺序,
活动和最终平衡
我需要找出一种方法,看看非余额行的总和是否等于期末余额和起始余额之间的差值。每个帐户的结果1表示是,0表示否将简单地添加到结果集中
例如:
账户111的起始余额为0.00。有两个账户活动记录,分别为10.00和-2.5。这导致期末余额为7.50
我一直在玩弄临时工作台,但我不确定是否有更有效的方法来实现这一点
感谢您的任何意见 未经测试的代码,但对于将合计余额与您在问题中定义的余额行进行比较而言,应该非常接近
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
我将使用,然后按帐户分组行,计算沿途的总计:
;
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
这里使用排名只是为了更容易计算起止平衡差。例如,如果起始余额行和结束余额行具有不同的余额行代码,如1表示起始余额,2表示结束余额,则可以避免排序。好方法,允许您仅选择总和和行值不同的行+1.优雅: