【问题标题】:SQL Update Table with Sum Results带有求和结果的 SQL 更新表
【发布时间】:2015-11-20 05:32:42
【问题描述】:

我有两个表(“短缺”、“订单”)。 Shortages 包含每个 Material 一次,Orders 是所有 Material 订单。我正在尝试使用 Orders 中材料的所有订单的总和来更新 Shortages 字段 CurrentWeek。

我不是 SQL 专家,这让我很困惑。我用谷歌搜索了一些东西,但我似乎无法得到任何工作。

我可以编写一个选择查询,通过所有 WHERE 子句获得我想要的结果,但我无法将值放入另一个表中。

非常感谢任何帮助!

【问题讨论】:

  • 向我们展示您尝试过的代码。这将有助于我们为做出回应奠定基础。
  • SELECT Orders.Material, Sum(Orders.Quantity) AS SumOfQuantity FROM Orders WHERE (((Orders.Plant)="N.Amer") AND ((Left([Orders].[Order_Number],4))<>"NA01") AND ((Year([Ship_Date])*53+DatePart("ww",[Ship_Date]))=Year(Date())*53+DatePart("ww"‌​,Date()))) GROUP BY Orders.Material; 这就是我的选择查询,它给了我想要的东西并将其分组...我正在尝试将分组的总和传递给 Shortages 表...材料是之间的链接两张桌子。我会尝试更多,看看我能发布什么。

标签: mysql sql


【解决方案1】:

听起来你想要这样的东西:

UPDATE Shortages
   SET CurrentWeek = (SELECT SUM(quantity)
                        FROM Orders
                       WHERE Orders.Material = Shortages.Material
                         AND <which records in Orders count toward the current Shortages record>)
 WHERE <which records in Shortages you want to update>

显然,您需要使用正确的列名对其进行修改。

【讨论】:

  • 您可能还需要在 where 中进行额外的过滤以将其限制为“当前周”
  • 好吧,我试过Update Shortages Set CurrentWeek=(SELECT Orders.Material, Sum(Orders.Quantity) AS SumOfQuantity FROM Orders WHERE (((Orders.Plant)="N.Amer") And ((Left(Orders.Order_Number,4))&lt;&gt;"NA01") And ((Year([Ship_Date])*53+DatePart("ww",[Ship_Date]))=Year(Date())*53+DatePart("ww",Date()))) GROUP BY Orders.Material) 但现在我被告知我已经“编写了一个子查询,它可以返回多个字段,而无需在主查询的 from 子句中使用 EXISTS 保留字。”值得注意的是,此时我正在使用 Microsoft Access(如果有帮助的话)。
  • 正如它所说,您的子查询中只能有一列。在内部选择中,您指定了Orders.Material, Sum(Orders.Quantity) AS SumOfQuantity,即两列。 UPDATE 语句的工作方式与您想象的不同:虽然它确实更新了所有记录,但语句本身定义了如何修改每个记录。基本上:对于 Shortages 中的每条记录,将 CurrentWeek 列设置为此值。子查询必须返回单个值,这就是为什么上面我将其限制为 WHERE 以将其过滤为“一个”材料,即“正在更新的当前行的材料”,Shortages.Material
  • 更像这样:Update Shortages Set CurrentWeek=(SELECT Sum(Orders.Quantity) FROM Orders WHERE (((Orders.Plant)="N.Amer") And ((Left(Orders.Order_Number,4))&lt;&gt;"NA01") And ((Year([Ship_Date])*53+DatePart("ww",[Ship_Date]))=Year(Date())*53+DatePart("ww"‌​,Date()))) and Orders.Material = Shortages.Material) 此外,其中一些条件可能需要在 UPDATE 语句的 Where 子句中,而不是子查询中。我用更多语法更新了我的答案
  • 格子现在试试看,我非常感谢它的解释!
【解决方案2】:

首先获取SUM(),然后执行更新连接。如下所示(** 这是一个演示查询,但希望您理解这一点)

update Shortages s
join (
select orderid, sum(order_qty) as total_qty
from orders
group by orderid ) xxx on s.orderid = xxx.orderid
set s.CurrentWeek = xxx.total_qty;

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 1970-01-01
    • 2022-01-19
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多