SQL Server中的分类帐类型更新

时间:2018-08-04 07:25:07

标签: sql 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

2 个答案:

答案 0 :(得分:1)

我想您只需要对tranType等于'D'的地方求和,那么这可能会有所帮助:

Update proreg 
SET proreg.opnamt = (SELECT SUM(CASE WHEN promast.LType = 'D' THEN promast.amount
                                     WHEN promast.LType = 'C' THEN promast.amount * (-1) END) 
                     FROM promast 
                     WHERE proreg.region = promast.region 
                       AND proreg.area = promast.area)

如果TranType列为C的行已经在减号中,则使用此行:

Update proreg 
SET proreg.opnamt = (SELECT SUM(CASE WHEN promast.LType = 'D' Or promast.LType = 'C' THEN promast.amount ELSE 0 END) 
                     FROM promast 
                     WHERE proreg.region = promast.region 
                       AND proreg.area = promast.area)

请测试此代码,如果有效,请给我反馈。

答案 1 :(得分:1)

尝试此查询:

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