SQL设置列与派生值

时间:2019-01-02 22:15:00

标签: sql database sql-update

如何将列值设置为“ 1”,其中sum(price)> = 88

例如:如果客户A的总和(价格)大于或等于88,则交货将更新为“ Y”

客户表:名称,价格,交货期(我只列出了重要的一列)

我的SQL查询:

UPDATE  customer
SET delivery ='Y'
WHERE (SELECT SUM(price) FROM customer
GROUP BY name )>=88;
  

错误:您无法在FROM子句中指定目标表“客户”进行更新

请参阅附表:

enter image description here

4 个答案:

答案 0 :(得分:0)

将列设置为您从表中选择的值,而不将其分组。
SET COLUMN_X = (SELECT SUM(price) FROM customer)

现在使用查询,它看起来更干净

UPDATE  customer
SET delivery ='Y'
WHERE COLUMN_X = >=88;

答案 1 :(得分:0)

您没有说您正在使用哪个数据库(或哪个版本),因此您可以尝试使用此 standard SQL

with
x as (
  select name
  from customer
  group by name
  having sum(price) > 88
)
update customer c
set delivery = 'Y'
where name in (select name from x)

答案 2 :(得分:0)

@TheImpaler基本上是相同的东西,但是带有子查询而不是CTE

获取首先符合条件的名称,然后加入该列表以进行UPDATE语句。

UPDATE t
  SET delivery = 'Y'
FROM
  #t AS t
JOIN
  (
    SELECT
      name
     ,SUM(price) AS total
    FROM
      #t
    GROUP BY
      name
    HAVING
      SUM(price) >= 88
  ) AS d
    ON
    d.name = t.name;

这里是正常工作的Rester:https://rextester.com/LQWE88535

答案 3 :(得分:0)

要更新的表和子选择之间没有任何联接。您的桌子上实际上没有钥匙,但是根据您显示的内容,我会这样做:

Component

因此,基本上,它会获取每个客户的名称以及总和或其订单价格,但仅在总和超过88的情况下。然后,它仅从该子选择中提取名称,并且仅更新列表中存在该名称的行总计超过88个订单的名称。