这听起来真的应该可以用 SQL 解决。但这并非微不足道 - 基本上您需要对每种产品的所有折扣进行乘法聚合。
在Aggregate multiplicate function 的大力帮助下:
SELECT p.ProductID, p.Product_Name, p.Product_Price * d.Product_Discount AS Discounted_Price
FROM tblProducts p
LEFT JOIN (
SELECT ProductID, EXP(SUM(LOG(1-[Discount]))) AS Product_Discount
FROM tblProd_Disc
GROUP BY ProductID
) d
ON p.ProductID = d.ProductID
但如果产品根本没有折扣,这将不起作用。
我尝试了Nz() 或IIf() 的各种组合以将1 转换为d.Product_Discount,但对于此产品,它总是返回#Error。
作为一种解决方法,您可以使用 UNION 查询,添加未修改价格的产品。
SELECT p.ProductID, p.Product_Name, p.Product_Price * d.Product_Discount AS Discounted_Price
FROM tblProducts p
INNER JOIN (
SELECT ProductID, EXP(SUM(LOG(1-[Discount]))) AS Product_Discount
FROM tblProd_Disc
GROUP BY ProductID
) d
ON p.ProductID = d.ProductID
UNION
SELECT p.ProductID, p.Product_Name, p.Product_Price
FROM tblProducts p
WHERE NOT EXISTS (
SELECT * FROM tblProd_Disc d WHERE d.ProductID = p.ProductID)
我的样本数据:
+-----------+--------------+---------------+
| ProductID | Product_Name | Product_Price |
+-----------+--------------+---------------+
| 1 | stuff | 100,00 € |
| 2 | no discount | 100,00 € |
| 3 | one | 100,00 € |
+-----------+--------------+---------------+
+--------+-----------+----------+
| DiscID | ProductID | Discount |
+--------+-----------+----------+
| 1 | 1 | 10,00% |
| 2 | 1 | 15,00% |
| 3 | 3 | 20,00% |
+--------+-----------+----------+
结果:
+-----------+--------------+------------------+
| ProductID | Product_Name | Discounted_Price |
+-----------+--------------+------------------+
| 1 | stuff | 76,5 |
| 2 | no discount | 100 |
| 3 | one | 80 |
+-----------+--------------+------------------+