计算正在运行的SQL Server总存储过程

时间:2018-07-09 14:20:30

标签: sql sql-server tsql stored-procedures

使用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时,我要使用运行总计作为已更新的行

3 个答案:

答案 0 :(得分:1)

我不会这样做。 我将使此过程更具事务性和规范性。 创建一个表来存储有关库存的记录。

这会将添加和删除清单中的内容仅转换为INSERT语句。 添加将插入数量的正整数,而删除将插入数量的负整数。

然后,您可以总结任何期间的数量,并确切知道您的库存。由于您将存储库存中任何交易的价格,因此您可以根据需要处理该数学运算。

这将允许您导出正在创建的表,并且此时只是一个数学问题。

答案 1 :(得分:0)

使用spInsert_Inventory之类的名称,并且代码实际上是在执行UPSERTMERGE(取决于您使用的数据库),因此您可能应该将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)