【问题标题】:Sum field(s) from one table in another table, summing from 3 different tables总和字段)来自另一个表中的一个表,从 3 个不同的表中求和
【发布时间】:2017-12-30 16:18:11
【问题描述】:

我有一个带有客户 ID 的 Access 数据库。每个客户可以有多个订单,每个订单可以是不同的类型。对于每种订单类型,我有三个单独的表(在线、店内、付款计划),每个订单的金额各不相同,都与客户 ID 相关。在其中一个表中,有两种类型的订单类型,必须在同一个表中单独维护金额。 我想在另一个名为 Totals 的表中对每种订单类型求和。我可以成功创建一个查询以根据客户 ID 获取每种类型的总和,但我不确定如何在我的总计表。对多个客户重复以下场景,每种类型都有自己的表格——付款计划一起在一个表格中。我有历史数据,所以我仅限于如何操作合并字段以及其他操作。

客户 ID#:1

订单类型:在线 在线金额:$20.00

订单类型:在线 在线金额:$40.00

网上总金额:$60.00

订单类型:店内 在线金额:$35.00

订单类型:店内 在线金额:$60.00

店内总金额:95.00 美元

订单类型:付款计划 付款计划 1 金额:$30.00

付款计划 1 金额:23.00 美元

付款计划 1 金额:53.00 美元

订单类型:付款计划 2 付款计划 2 金额:$35.00

付款计划 2 金额:30.00 美元

付款计划 2 金额:65.00 美元

在我的总计表中,每种类型都有一个字段,用于汇总每个客户 ID 所花费的金额,然后在一个字段中将所有订单类型汇总到一个总字段中。

我正在学习,所以感谢任何帮助/示例。谢谢你。

【问题讨论】:

    标签: database ms-access


    【解决方案1】:

    为您的不同订单类型设置单独的表格并没有帮助。对于数据库,最好使用一个包含 sale_type 字段的所有销售表。

    您没有准确描述您的表格是什么样子,所以我不得不做出几个假设。如果您的表包含OrderType 字段,那么您可以创建一个联合查询来将您的所有销售连接在一起:

    SELECT                CustomerID
                        , OrderType
                        , Amount
    FROM                Online
    
    UNION ALL SELECT    CustomerID
                        , OrderType
                        , Amount
    FROM                [In-Store]
    
    UNION ALL SELECT      CustomerID
                        , OrderType
                        , Amount
    FROM                [Payment Plan]  
    

    如果您没有OrderType,您可以将值硬编码到查询中:

    SELECT                CustomerID
                        , "Online" AS OrderType
                        , Amount
    FROM                Online
    
    UNION ALL SELECT    CustomerID
                        , "In-Store"
                        , Amount
    FROM                [In-Store]
    
    UNION ALL SELECT      CustomerID
                        , "Payment Plan"
                        , Amount
    FROM                [Payment Plan]  
    

    注意 - 在第一个 Select 块中为 OrderType 声明字段名称。您可以在每个块中执行此操作,但 Access 只查看第一个块。

    与所有查询一样,结果以表格形式出现,可以这样处理。所以现在我们需要列出CustomerName(我假设你有一个Customers 表)、OrderType 以及CustomerOrderType 的金额之和。

    SELECT        CustomerName
                , OrderType
                , SUM(Amount)
    FROM        Customers INNER JOIN 
                    (
                        SELECT                CustomerID
                                            , OrderType
                                            , Amount
                        FROM                Online
    
                        UNION ALL SELECT      CustomerID
                                            , OrderType
                                            , Amount
                        FROM                [In-Store]
    
                        UNION ALL SELECT      CustomerID
                                            , OrderType
                                            , Amount
                        FROM                [Payment Plan]
                    ) T1 ON Customers.CustomerID = T1.CustomerID
    GROUP BY    CustomerName
                , OrderType
    

    您的三个表中的所有销售都将在客户表中包含一个客户,因此我们可以使用 INNER JOIN 仅返回值出现在两个表中的记录(客户表和查询表的结果)。
    UNION QUERY 括在方括号中并命名为 T1,并在 CustomerID 字段中加入 Customers 表。
    我们对不属于聚合函数的所有字段进行分组,因此对CustomerNameOrderType 进行分组并对Amount 字段求和。

    这就是您真正需要做的所有事情 - 每次您希望总计获得最新值时都运行查询。不需要将结果推送到Totals 表,因为一旦您进行新销售(或有人退货),该表就会过时。

    如果你真的想将INSERT这些数字放到Total表中,只需在SQL中添加第一行:

    INSERT INTO Total (CustomerName, OrderType, Amount)
    

    【讨论】:

    • 哇!非常感谢您的详细解释和所有代码,这太棒了。你的假设是正确的。非常感谢您的帮助!
    【解决方案2】:

    这是一个肮脏的解决方法,但我认为可能有更直接的解决方案。

    您可以创建一个输出表(我将其分解为 ID、Online、InStore 和 Total)并在 UPDATE 查询中使用 DSum 函数。

    UPDATE tbl_Totals SET
           Total_InStore = DSum("Amount", "tbl_InStore", "Customer_ID = " & Customer_ID),
           Total_Online = DSum("Amount", "tbl_Online", "Customer_ID = " & Customer_ID),
           Total = DSum("Amount", "tbl_InStore", "Customer_ID = " & Customer_ID) + DSum("Amount", "tbl_Online", "Customer_ID = " & Customer_ID)
    

    【讨论】:

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