【问题标题】:Find Cost from Product ID in MS Access在 MS Access 中从产品 ID 查找成本
【发布时间】:2015-04-25 22:13:58
【问题描述】:

我正在尝试在 MS Access 中为订单的“总成本”创建一个计算字段。我的表相关如下:

所以我希望能够将 Orders: Cost 设置为一个计算字段,在该字段中它获取与项目 1、2、3、4 和 5 中的每一个相关联的值并将它们加在一起。

另外,有没有更灵活的方法可以在每个订单中添加多个产品而无需多个项目列?

提前致谢!

(我对此很陌生,如果我错过了任何重要的内容,请道歉)

【问题讨论】:

    标签: database ms-access relationship


    【解决方案1】:

    正如其他人所强调的那样,您的表格的结构方式存在一个根本问题。为了回答您的问题,我建议您先调整表架构。

    因此,我将首先回答您的第二个问题:

    有没有更灵活的方法可以在每个订单中添加多个产品而无需多个项目列?

    是的。通常,您会希望使用第二个表来存储您的订单项目。这种类型的表通常称为“桥表”,它允许您为每个订单存储无限数量的项目。让我们将此表称为Order Items

    顺便说一句,我假设您的表 Products、Products_1、Products_2、Products_3 和 Products_4 都是同一个表的接口?而不是 5 个表都包含您的产品数据的副本。我稍后会回到这个。

    让我们重组您的表格,使其看起来像这样:

    请注意我们的新桥接表Order Items。要在此处存储订单项目,只需为订单包含的每个产品创建一条记录,并引用产品 ID 和关联的订单 ID。

    订单示例

    数据

    Orders表:

    +----------+------------+------+
    | Order ID | Order Date | Cost |
    +----------+------------+------+
    |        1 | 2015-04-25 | —    |
    +----------+------------+------+
    

    注意:暂时忽略成本字段。待会儿我会讲到的。

    Order Items表:

    +----------+------------+
    | Order ID | Product ID |
    +----------+------------+
    |        1 |          2 |
    |        1 |          3 |
    |        1 |          5 |
    +----------+------------+
    

    Products表:

    +------------+---------+------+-------+
    | Product ID | Product | Type | Price |
    +------------+---------+------+-------+
    |          1 | Hat     | —    |     5 |
    |          2 | Scarf   | —    |    10 |
    |          3 | Gloves  | —    |    12 |
    |          4 | Coat    | —    |    50 |
    |          5 | Boots   | —    |    25 |
    +------------+---------+------+-------+
    

    说明

    在上面的示例数据中,订单是在 2015 年 4 月 25 日下达的。订单是 3 个产品:

    • 围巾
    • 手套
    • 靴子

    通过使用Order Items 桥接表,我们能够以更灵活的格式存储有关订购产品的信息。与原始数据库架构相比,它的最大优势在于您不再限于每个订单 5 件商品。

    现在,如果我之前关于多个产品表的假设是错误,那么这个新架构将为您带来额外的优势,因为您不再需要跨 5 个表复制产品数据。您永远不必在数据库中复制数据 - 目标是始终拥有“单一事实来源”。因此,您的产品数据应该只存储在一个地方,并且绝不复制到多个表中。

    这就是所谓的“规范化”数据库架构。

    那么成本计算如何?

    我必须承认,我不是 MS Access 专家。我对 MySQL 有更多的经验。所以我会尽量提供帮助。

    首先 - 我在这里所说的一切都将基于我上面提出的新表结构。原始表结构的成本计算会有所不同(并且可能更复杂!)

    使用数据库的优点之一是您可以动态查询数据并执行计算。一种这样的计算是总订单成本。 MS Access 将提供一项功能,根据相关产品的价格动态计算订单的总成本。由于可以动态计算,因此您无需将此值存储在数据库中。

    还记得我之前说过的关于在您的数据库中拥有“单一事实来源”的内容吗?这也适用于此。无需存储计算得出的订单总额,因为每次更改订单商品时,您最终都必须重新计算。这将是多余的,因为它可以由 MS Access 动态计算。

    包含订单总额的示例 SQL 查询可能如下所示:

    SELECT
        `Orders`.*, SUM(`Products`.`price`) AS `Cost`
    FROM
        `Orders`
    LEFT JOIN `Order Items` ON (
        `Orders`.`Order ID` = `Order Items`.`Order ID`
    )
    LEFT JOIN `Products` ON (
        `Order Items`.`Product ID` = `Products`.`Product ID`
    )
    GROUP BY
        `Orders`.`Order ID`
    

    这里我使用SUM() 函数来计算与订单相关的所有产品价格的总和。 GROUP BY 运算符用于将与单个订单关联的所有产品集中在一起。当然,这一切都与 2 个连接联系在一起:Orders -> Order ItemsOrder Items -> Products

    总而言之 - 尽管您已经走在正确的轨道上,但您需要稍微改变您的数据库结构。新的数据库结构已标准化,可让您执行查找并轻松计算总订单成本。

    希望对您有所帮助。


    后续步骤(可选)

    一旦你解决了基本问题,你可能有兴趣更进一步。

    您可能忽略的一件事是人们可以订购多个相同的产品。以我上面的例子为例,如果我们想要 2 条围巾 在我们的订单中而不是 1 条呢?您目前无法针对订单中的每个产品存储数量。

    您需要在Order Items 表中添加一个Quantity 字段。因此,我们的新示例订单商品表将如下所示:

    Order Items表:

    +----------+------------+----------+
    | Order ID | Product ID | Quantity |
    +----------+------------+----------+
    |        1 |          2 |        2 |
    |        1 |          3 |        1 |
    |        1 |          5 |        1 |
    +----------+------------+----------+
    

    从这里您可以看到订单包含 2 条围巾、1 双手套和 1 双靴子。

    用数量计算总计

    这个新的数量字段将要求您更改计算总订单成本的方式。我们现在需要做 Quantity × Product Price,然后将它们加起来得到订单总数。

    This SO post may be of some help for this. 基本上你会想要使用类似下面的东西(UNTESTED!):

    SELECT
        `Orders`.*, SUM(`Products`.`price` * `Order Items`.`Quantity`) AS `Cost`
    FROM
        `Orders`
    LEFT JOIN `Order Items` ON (
        `Orders`.`Order ID` = `Order Items`.`Order ID`
    )
    LEFT JOIN `Products` ON (
        `Order Items`.`Product ID` = `Products`.`Product ID`
    )
    GROUP BY
        `Orders`.`Order ID`
    

    请注意,我们现在将价格和数量相乘以计算 Cost 字段。

    产品价格变化

    未来要考虑的另一件事是您的产品价格是否会发生变化。当我的示例订单下达时,手套成本为 12(美元/英镑/等)。如果在我下订单后产品价格上涨,我们将不再有下订单时支付的价格记录。

    我觉得我现在已经领先一步了,所以我会把这件事留给你考虑。如果您需要这方面的帮助,您可能应该发布一个新问题。

    【讨论】:

    • 您先生,是真正的弥赛亚第二次降临。非常感谢!
    • 没问题@JamesHughes,我很高兴能帮上忙。
    【解决方案2】:

    目前,您的设计没有“标准化”。

    您的“订单”表应拆分为两个表,如下所示:

    表格“订单”:

    • 订单编号
    • 订购日期
    • 成本(这个字段有什么用?)

    表“已订购商品”:

    • 订单编号
    • 产品编号

    因此,“订购的商品”可以包含无限的订购商品列表。然后,您可以非常轻松地创建任何类型的总和和其他计算。

    【讨论】:

    • Cost 用于保存每个订单的总成本。那么我如何将多个产品与每个订单 ID 关联?
    • 或许,您应该将每件商品的成本也存储在“Ordered Items”表中。
    • 每件单品的成本是否已经存储在产品下?
    • 好吧,那你为什么要把成本和订单一起存储呢?
    • 因为我想要每个订单的总成本,从每个单独项目的成本总和计算得出
    【解决方案3】:

    抱歉,如果我错过了任何重要的内容

    你做到了。您必须标准化您的数据(在此使用 bing/google) - 插入一个包含订单行的表格。然后,您将在订单表之间建立一种关系,在订单行和产品之间建立另一种关系。

    【讨论】:

      【解决方案4】:

      你的设计是错误的。我建议你阅读一些关于database normalisation 的教程并修正你的设计。
      您还可以找到/下载臭名昭著的 Northwind 数据库,该数据库曾经作为示例随 Access 一起提供。它是一个可用且设计得体的订单数据库,您可以将其用作起点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-06
        • 1970-01-01
        相关资源
        最近更新 更多