sql-server - 使用子查询聚合但输出不同
问题描述
当销售数量超过 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)。
我犯的错误在哪里?
解决方案
您的代码虽然可以大大简化,但可以返回正确的结果,如您在此演示中所见。
它可以返回您获得的结果的唯一方法是如果您像这样连续运行它 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
请参阅演示。
推荐阅读
- swift - swift中组件的唯一字符(separatedBy :)
- swift - Armadillo C++ 库 - C++11 编译器需要错误
- sql - 将 csv 文件从 postgresql 数据库服务器导出到本地计算机
- python - 忽略列表中的 none 并在 python 中取最小值和最大值
- javascript - 传递给函数时,对象索引数组被打乱
- r - R翻译curl命令以发布多部分形式 - 问题
- javascript - DOM 无法识别“InseartAdjacentHTML”
- node.js - Angular 10 的 JSReport 新手
- python - 将 3D 笛卡尔数据插值到球面
- deep-learning - 为什么我使用 cpu 而不是 cuda 在 colab 中运行脚本?