Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 在t-sql中,如何检查某些记录的总和是否等于其他两条记录之间的差值?_Tsql_Sql Server 2005_Sum_Temp Tables - Fatal编程技术网

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.优雅: