首页 > 解决方案 > 使用子查询聚合但输出不同

问题描述

当销售数量超过 10 件时,我想以 15% 的保证金更新产品单价。

数据集是https://drive.google.com/drive/folders/1O7RAnfJMmqOPaiIwQyKSXKXVf01NpCJd?usp=sharing

这是我的代码

UPDATE PRODUCT_MASTER
SET Unit_Price = t1.new_price 
FROM PRODUCT_MASTER as pm
INNER JOIN (
    SELECT
      Product_ID,
      SUM(Unit_Sold) AS total_unit
    FROM SALES_TRANSACTION
    GROUP BY PRODUCT_ID
) AS t2 
  ON pm.Product_ID = t2.Product_ID 
INNER JOIN (
    SELECT
       Product_ID,
       (Unit_Price * 1.15) AS new_price
    FROM Product_Master
) AS t1
  ON pm.Product_ID = t1.Product_ID 
WHERE t2.total_unit > 10

SELECT *  
FROM PRODUCT_MASTER

我的输出是

子查询输出

如果我对 201 进行手动计算,因为它的 total_unit 大于 10,则 500*1.15 = 575 但结果显示为 760。这对于售出超过 10 个单位的其他 product_ID 相同,例如 203-206)。

我犯的错误在哪里?

标签: sql-servertsqljoinsql-update

解决方案


您的代码虽然可以大大简化,但可以返回正确的结果,如您在此演示中所见。

它可以返回您获得的结果的唯一方法是如果您像这样连续运行它 3(!) 次。

将您的查询简化为:

UPDATE pm 
SET pm.Unit_Price = 1.15 * pm.Unit_Price
FROM PRODUCT_MASTER as pm
INNER JOIN (
  SELECT Product_ID 
  FROM SALES_TRANSACTION 
  GROUP BY PRODUCT_ID
  HAVING SUM(Unit_Sold) > 10
) AS t2 ON pm.Product_ID = t2.Product_ID 

请参阅演示


推荐阅读