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
解决方案
试试这个查询:
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
推荐阅读
- linux - Trisquel 9 - 内核升级和暂停笔记本电脑后不再通过以太网访问有线互联网
- react-native - React.createContext 未更新
- django-filter - 从 django 表中导出过滤后的数据
- reactjs - 如何将 node_modules 中的组件导入主 index.js 文件?(反应和 AEM)
- javascript - 使用 Javscript 按钮同步 classList.toggle 和 innerHTML 更改
- arrays - 我如何访问 char** 字符串中的下一个元素
- nix - 如何编写一个启动并可以在 nix-shell 环境中运行命令的 Haskell 程序?
- azure-web-app-service - Azure 应用服务 (Linux) CI/CD 构建不会删除从存储库中删除的文件
- php - 循环请求中的偏移量和限制
- matlab - Matlab中多个变量的顺序求解方程