3

我想使用以下查询更新表 products 上的 qty 字段。此查询在 Qty 字段中向我返回所需的数字。

SELECT e.Prod_name, e.Prod_number,
  (SUM(e.Qty) - SUM(g.Qty)) Qty
FROM Products_Invoices e JOIN (
    SELECT product_number, SUM(qty) Qty
    FROM SoldItemsCalc
    GROUP BY product_number
  ) g ON e.Prod_number = g.product_number
GROUP BY Prod_number, Prod_name
order by Prod_name

如何使用此查询并更新 product_number 匹配的值

我不介意您是否更改查询...只需要更新数量值

谢谢

4

2 回答 2

3

我这样做:

with toupdate as (
    SELECT e.Prod_name, e.Prod_number, (SUM(e.Qty) - SUM(g.Qty)) Qty
    FROM Products_Invoices e JOIN (
         SELECT product_number, SUM(qty) Qty
         FROM SoldItemsCalc
         GROUP BY product_number
        ) g ON e.Prod_number = g.product_number
    GROUP BY Prod_number, Prod_name
   )
update t
    set qty = toupdate.qty
    from toupdate
    where t.prod_nubmer = toupdate.prod_number
于 2013-02-20T14:40:55.687 回答
1

你确定你的数量正在产生你想要的结果吗?您在子查询中执行 SUM,然后在外部查询中执行另一个 SUM。这可能会弄乱你的数字。这是@Gordon 的好答案的一个细微变化——这是使用我认为你想要的数量更新 Product 表:

with toupdate as (
    SELECT e.Prod_name, e.Prod_number, (SUM(e.Qty) - g.Qty) Qty
    FROM Products_Invoices e JOIN (
         SELECT product_number, SUM(qty) Qty
         FROM SoldItemsCalc
         GROUP BY product_number
        ) g ON e.Prod_number = g.product_number
    GROUP BY Prod_number, Prod_name, g.Qty
   )
update p
    set qty = t.qty
    from products p join toupdate t on p.prod_number = t.prod_number;

这是带有示例的小提琴:http ://www.sqlfiddle.com/#!3/42c80/1

Product_Invoices 表中有 2 条记录总和为 150。SoldItemsCalc 表中有 2 条记录总和为 25。使用您的查询,当我想您想要 125 时,总体结果变为 100。

顺便说一句——使用上面的 CTE 将适用于 SQL Server 2005 及更高版本。如果您需要支持 SQL Server 2000,请使用此版本:

update p
    set qty = t.qty
    from products p join (
      SELECT e.Prod_name, e.Prod_number, (SUM(e.Qty) - g.Qty) Qty
      FROM Products_Invoices e JOIN (
         SELECT product_number, SUM(qty) Qty
         FROM SoldItemsCalc
         GROUP BY product_number
        ) g ON e.Prod_number = g.product_number
    GROUP BY Prod_number, Prod_name, g.Qty) t on p.prod_number = t.prod_number;
于 2013-02-20T14:56:59.253 回答