vba - 当应用多个折扣时获得最终产品价格

时间:2017-07-03 08:50:46

标签: sql ms-access access-vba

我是新手,对记录集完全没有希望,所以如果你花时间回答我的问题,请非常好地加入一些简短的解释,这样我就能掌握它。

我有2张桌子。

1) tblProducts ,带字段标题:ProductID - Product_Name - Product_Price

2) tblProd_Disc ,带字段标题:ProductID - 折扣(每个产品与超过1折扣关联)

目标:在连续应用每个折扣后获得每个产品的最终价格,例如。如果产品1的价格为100且折扣为10%和15%,则最终价格应为76.5。

我想我应该把它放在一个使用ProductID作为参数的函数中。

谢谢!

1 个答案:

答案 0 :(得分:0)

这听起来像真的应该可以用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 |
+-----------+--------------+------------------+