SQL:如何通过计算更新所有行?

时间:2015-05-24 05:33:50

标签: sql sql-server tsql sql-update

我尝试根据订单total pricesub-total添加tax披萨订单。我收到一条错误,指出子查询使用此命令返回的值超过1:

DECLARE @orderTotal AS INT
SET @orderTotal = (SELECT(SUM((orderSubtotal+tax) * (1 - discountAmount)))
                   FROM OrderProcessing GROUP BY orderID)
UPDATE OrderProcessing
SET orderTotalAmount = @orderTotal

discountAmount等于0.2之类的十进制数,代表20%折扣。

5 个答案:

答案 0 :(得分:5)

首先,这是错误的方法,除非您希望所有订单在orderTotalAmount列中具有相同的值。
我想你可能正在寻找这样的东西:

UPDATE OrderProcessing
SET orderTotalAmount = (orderSubtotal + tax) * (1 - discountAmount)

其次,我认为你的第一个查询中有太多括号。

答案 1 :(得分:1)

我认为你不需要一个小组,但它应该像

UPDATE OrderProcessing o
SET orderTotalAmount =
    (SELECT(SUM((orderSubtotal + tax) * (1 - discountAmount)))
    FROM OrderProcessing
    WHERE orderID = o.orderId)

否则,在错误状态下,子查询返回多条记录。

答案 2 :(得分:0)

您实际上可以通过使用某个函数将子查询返回的行限制为1。

MYSQL:

   SELECT column_name(s)
   FROM table_name
   LIMIT number;

甲骨文:

   select *
   from  
   ( //your query here ) 
   where ROWNUM = 1;

或者:

    SELECT column_name(s)
    FROM table_name
    FETCH FIRST N ROWS;

希望它的帮助:)

答案 3 :(得分:0)

DECLARE @orderTotal INT, @orderID int
SELECT @orderTotal = SUM((orderSubtotal+tax) * (1 - discountAmount)) 
FROM OrderProcessing 
WHERE orderID = @orderID 
GROUP BY orderID

UPDATE OrderProcessing
SET orderTotalAmount = @orderTotal
WHERE orderID = @orderID

如果我理解正确,您需要使用唯一值

更新OrderProcessing表中的许多行

答案 4 :(得分:0)

原始查询为每个orderID返回一行。 之后,您想要更新orderTotalAmount,但是您没有指定哪个orderID。 显然,您希望以相同的方式更新所有订单。 为此你需要sfrutig方法。 您需要在查询中指定要处理的orderID,然后返回一行。 并在循环中使用它来更新所有订单。

由于我没有足够的分数,我无法将此评论放在sfrutig的解决方案旁边。