sql - 如何在触发器更新时对多行求和?
问题描述
我写了一个更新表的触发器[CART]
来计数并将值插入到其他表[HEADERS]
的列[SUM]
中。它有效,但仅适用于 1 行 where [CART].[NUMBER] = [HEADERS].[NUMBER]
。[NUMBER]
中的列[CART]
不是唯一的,我想计算所有相同[CART]
的值[NUMBER]
。这意味着[AMOUNT]*[PRICE]
对于具有相同数字的每一行,将其添加并插入列[HEADERS].[SUM]
这是我得到的:
CREATE TRIGGER [dbo].[sum] ON [dbo].[CART] AFTER UPDATE AS
BEGIN
DECLARE @RESULT DECIMAL
DECLARE @AMOUNT FLOAT
DECLARE @PRICE FLOAT
DECLARE @NUMBER FLOAT
SET NOCOUNT ON;
IF UPDATE([NUMBER]) or UPDATE([AMOUNT]) or UPDATE([STATUS])
BEGIN
SELECT @AMOUNT=[AMOUNT],@PRICE=[PRICE],@NUMBER=[NUMBER] FROM inserted
IF @NUMBER is not NULL
BEGIN
SELECT @RESULT=@AMOUNT * @PRICE
UPDATE HEADERS SET SUM=@RESULT WHERE NUMBER=@NUMBER
END
END
GO
我不太擅长 SQL,而且我找不到此任务的正确语法。你能帮助我吗?
解决方案
您的触发器代码不处理更新多行的情况。
CREATE TRIGGER [dbo].[sum] ON [dbo].[CART] AFTER UPDATE AS
BEGIN
SET NOCOUNT ON;
IF UPDATE([NUMBER]) or UPDATE([AMOUNT]) or UPDATE([STATUS])
BEGIN
UPDATE H
SET [SUM] = I.AMOUNT * I.PRICE
FROM inserted I
INNER JOIN HEADER H ON I.NUMBER = H.NUMBER
END
GO
推荐阅读
- php - 使服务器应用程序仅接受来自同一主机中客户端应用程序的请求
- javascript - 滚动显示,但不能在固定菜单内的绝对 div 内的 div 中工作
- vba - VBA WORD:查找具有特定样式的段落
- c++ - 在 C++ 中,集合的迭代器可以用来查找集合的两个连续元素之间的差异吗?
- python - Kivy Popup 更改背景
- c++ - 当通过命令行参数从配置文件中给出数组的大小时,我们如何使用 std::array ?
- batch-file - 执行一次时将 .bat 文件转换为启动脚本
- neo4j - Neo4j 图算法和图数据科学之间的区别
- wordpress - Woocommerce 如果购物车商品属于此类别,请将其删除
- c++ - 在我的情况下如何修复未定义的引用?