首页 > 解决方案 > SQL Server 中的分类帐类型更新

问题描述

Promast 是一个示例交易表,我想更新 Proreg 一个示例期初余额表。

我想从基于 trantype 的总和开始扫描 promast,然后用总和值更新 Proreg。

在不使用游标的情况下如何在 SQL Server 中实现这一点。

谢谢和问候, 莫汉

表名:promast(这是一个示例交易数据)

Region  area    name       amount   TranType
----------------------------------------------
  01    AA      Capital      10       D
  01    AA      Capital     -20       C
  01    AA      Capital      50       D
  01    BB      Capital      80       D
  01    BB      Capital     -30       C
  01    BB      Capital      40       D

表名:proreg(这是维护余额)

region  area    opnamt
------------------------
  01    AA        40
  01    BB        90

我的 SQL 查询:

UPDATE proreg 
SET proreg.opNamt = proreg.OpNamt + (SELECT 
                         CASE 
                            WHEN promast.LType = 'D' 
                               THEN SUM(promast.amount)  
                            WHEN promast.LType = 'C' 
                               THEN SUM(promast.amount) 
                            END
                     FROM 
                         promast 
                     WHERE 
                         proreg.region = promast.region 
                         AND proreg.area = promast.area 
                     GROUP BY 
                         promast.LType ) 
FROM proreg 

我收到此错误:

消息 512,级别 16,状态 1,第 13 行
子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

我知道这是因为查询返回不止一行但想知道上面的最佳方法

不想这样更新

UPDATE proreg 
SET proreg.opnamt = (SELECT SUM(promast.amount) 
                     FROM promast 
                     WHERE proreg.region = promast.region 
                       AND proreg.area = promast.area 
                       AND promast.LType = 'D') 
FROM proreg

因为如果有更多类型,那就很麻烦了。

该命令应根据 Region、area 然后根据 Ltype Sum 扫描与 proreg 匹配的 promast 的所有记录并更新 proreg opnAmt

标签: sqlsql-server

解决方案


试试这个查询:

update reg set opnamt = opnamt + (select sum(amount) from @promast
                                  where region = reg.region 
                                    and area = reg.area 
                                    and LType in ('C', 'D'))
from @proreg reg

推荐阅读