使用SQL Server中的存储过程,我试图通过以下方式计算运行总计:
ALTER PROCEDURE spInsert_Inventory
(@Brand VARCHAR(50),
@Series VARCHAR(50),
@Model VARCHAR(50),
@Ram INT,
@HDD INT,
@Qty INT,
@Price INT)
AS
BEGIN
IF NOT EXISTS (SELECT 1 FROM Laptops
WHERE Brand = @Brand
AND Series = @Series
AND Model = @Model
AND ram = @Ram
AND hdd = @HDD)
BEGIN
DECLARE @totale INT = 0
SET @totale = (@Price * @Qty)
INSERT INTO Laptops
VALUES (@Brand, @Series, @Model, @Ram, @HDD, @Qty, @Price, @totale)
END
ELSE
BEGIN
UPDATE Laptops
SET qty = @Qty,
Price = @Price,
Total = ISNULL(Total, 0) + (@Price * @Qty)
WHERE
Brand = @Brand
AND Series = @Series
AND Model = @Model
AND ram=@Ram
AND hdd = @HDD
END
END
现在,当我尝试插入新记录并计算运行总额时,我的结果是两倍。例如,如果我插入Qty = 3和Price 3,则我的Total是18,但结果不正确。
我想要的输出:
Brand Series Model Ram HDD Qty Price Total
----------------------------------------------
AAA SAS DSS 200 25 3 3 9
BBB GFG KHH 50 65 5 20 100
当更新此行AAA或BBB时,我要使用运行总计作为已更新的行
答案 0 :(得分:1)
我不会这样做。 我将使此过程更具事务性和规范性。 创建一个表来存储有关库存的记录。
这会将添加和删除清单中的内容仅转换为INSERT语句。 添加将插入数量的正整数,而删除将插入数量的负整数。
然后,您可以总结任何期间的数量,并确切知道您的库存。由于您将存储库存中任何交易的价格,因此您可以根据需要处理该数学运算。
这将允许您导出正在创建的表,并且此时只是一个数学问题。
答案 1 :(得分:0)
使用spInsert_Inventory
之类的名称,并且代码实际上是在执行UPSERT
或MERGE
(取决于您使用的数据库),因此您可能应该将Qty
更新为qty=isnull(qty,0)+@Qty
而非qty=@Qty
,并且Price
应该是加权平均值:
Price = case when isnull(qty,0)+@Qty = 0
then @Price
else (isnull(Total,0)+@Price*@Qty)
/ (isnull(qty,0)+@Qty)
end
您的完整更新声明将如下所示:
UPDATE Laptops
set qty=isnull(qty,0)+@Qty
, Price = case when isnull(qty,0)+@Qty = 0
then @Price
else (isnull(Total,0)+@Price*@Qty)
/ (isnull(qty,0)+@Qty)
end
, Total=isnull(Total,0)+(@Price*@Qty)
WHERE Brand=@Brand
and Series=@Series
and Model=@Model
and ram=@Ram
and hdd=@HDD
答案 2 :(得分:-1)
您要添加到总计。您还会期待什么?
Total=isnull(Total,0)+(@Price*@Qty)