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
答案 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