如何为每个客户的产品创建单独的定价?

时间:2019-02-07 20:37:36

标签: database ms-access

我正在建立一个用于开具发票订单的数据库。我们有不同的工作,我们的产品价格不同。当我输入新工作时,我希望它链接到我们的默认价格,并且只能针对该客户进行修改。我们有100多种产品,只有某些产品的每项工作的价格有所调整,因此会默认加载。

1 个答案:

答案 0 :(得分:0)

这需要在客户和产品之间建立m到n的关系,这由保存客户特定价格的联结表实现。假设您有一个以Customer作为主键的表CustomerID和一个以Product作为主键的表ProductID,则新表如下所示:

Table CustomerPrice
-------------------
CustomerID  Number/Long, no default value, required
ProductID   Number/Long, no default value, required
Price       Number/Decimal, Scale 2, no default value, required

主键必须是复合键(CustomerIDProductID)。这样可以确保每种产品只能有一个特定于客户的价格。

使用删除级联在Customer.CustomerIDCustomerPrice.CustomerID之间以及使用删除级联在Product.ProductIDCustomerPrice.ProductID之间添加关系。 (您可以在用户界面中完成所有操作。)

默认价格将直接存储在Product表中。

您可以选择这样的产品价格

SELECT x.CustomerID, x.CustomerName, x.ProductID, x.ProductName, Nz(cp.Price, x.Price) AS Price
FROM
    (SELECT c.CustomerID, c.Name AS CustomerName, p.ProductID, p.Name AS ProductName, p.Price
     FROM Customer c, Product p) x
    LEFT JOIN CustomerPrice AS cp ON x.ProductID = cp.ProductID AND x.CustomerID = cp.CustomerID;

这会产生可用的客户特定价格,否则会生成默认产品价格。

如果您需要特定客户或产品的数据,请将WHERE子句添加到嵌套的SELECT

SELECT x.CustomerID, x.CustomerName, x.ProductID, x.ProductName, Nz(cp.Price, x.Price) AS Price
FROM
    (SELECT c.CustomerID, c.Name AS CustomerName, p.ProductID, p.Name AS ProductName, p.Price
     FROM Customer c, Product p
     WHERE c.CustomerID = 7 AND p.ProductID = 10) x
    LEFT JOIN CustomerPrice AS cp ON x.ProductID = cp.ProductID AND x.CustomerID = cp.CustomerID;