2017-07-24 81 views
0

我有一个带有客户ID的Access数据库。每个客户可以有多个订单,每个订单可以是不同的类型。我有三个单独的表格(在线,店内,付款计划),每种订单类型有不同的金额,都与客户ID有关。在其中一个表中,有两种类型的订单类型,必须分别使用同一个表来维护金额。 我想在另一个称为总计的表中总结每个订单类型。我可以成功地创建一个查询来获得每个类型的总和基于客户ID,但我不知道如何拉我的总表中的这些值。下面的情况对多个客户重复,每种类型都是它自己的表 - 支付计划一起放在一个表中。我有历史数据,所以我受限于我可以如何合并字段,什么不可以。从另一个表中的一个表中总结字段,从3个不同的表中求和

客户编号: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花费的金额,然后是一个将所有订单类型汇总到一个总的总字段中的字段。

我在学习,所以任何帮助/示例表示赞赏。谢谢。

回答

0

为不同的订单类型分开表格不会有帮助。对于数据库,最好为具有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表),OrderTypeCustomer & OrderType的总金额。

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返回只记录其中值出现两个表(Customers表查询表的&结果)英寸
UNION QUERY包装在括号中,并给出名称T1并加入到CustomerID字段中的Customers表。
我们对不属于聚合函数的所有字段进行分组,因此可以在CustomerNameOrderType上进行分组,并对Amount字段进行求和。

这就是您真正需要做的 - 每次您希望总计获得最新的值时,让查询运行。应该没有必要将结果推送到Totals表格中,因为只要您进行新的销售(或某人退货),该表格就会过期。

如果你真的想INSERT这些数字为Total表中的第一行只是添加到SQL:

INSERT INTO Total (CustomerName, OrderType, Amount) 
+0

哇!非常感谢你的详细解释和所有的代码,这真是太棒了。你的假设是正确的。我非常感谢你的帮助! – TechEng

0

这是一个肮脏的解决方法,但我认为可能有一个更直接的解决方案。您可以创建一个输出表(我把它分解为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) 
+0

谢谢你,我会记住这一点,@ThuroG – TechEng

相关问题