具有MS Access的多个内部联接产生多个结果..需要分组和总计

use*_*790 5 sql ms-access

我花了大约20分钟搜索了类似的问题,但大多数都没有为MS Access数据库指定.

不幸的是我的SQL经验非常有限,所以我很感激你对此的意见.

您可以从此链接下载Access数据库,以查看我正在尝试完成TestDB.zip.

此图像显示了一个非常基本的表设置,作为我希望实现的MS Access 2003中的示例:
在此输入图像描述

基本上我想运行一个SQL查询,它将显示包含相关表中所有信息的订单.

显然,如下所示的SQL查询将显示多行,其中包含重复信息,这不是我想要的.

SELECT Orders.OrderID, Orders.OrderTitle, Materials.Material, Materials.MaterialCost,
       Labour.HoursTaken, Invoices.InvoiceAmount
  FROM ((Orders INNER JOIN Labour ON Orders.OrderID = Labour.OrderID)
                INNER JOIN Materials ON Orders.OrderID = Materials.OrderID)
 INNER JOIN Invoices ON Orders.OrderID = Invoices.OrderID;
Run Code Online (Sandbox Code Playgroud)

结果:
在此输入图像描述

基本上,我想要一个查询,它将汇总每个订单的每个材料,小时和发票.我在这个电子表格中根据需要制作的东西可以在这里看到:
在此输入图像描述

显然,这个SQL不起作用,因为由于INNER JOINS导致多行,所以数字遍布整个地方.

SELECT Orders.OrderID, Orders.OrderTitle, Sum(Materials.MaterialCost) AS SumOfMaterialCost,
       Sum(Labour.HoursTaken) AS SumOfHoursTaken, 
       Sum(Invoices.InvoiceAmount) AS SumOfInvoiceAmount
  FROM ((Orders INNER JOIN Labour ON Orders.OrderID = Labour.OrderID) 
                INNER JOIN Materials ON Orders.OrderID = Materials.OrderID) 
 INNER JOIN Invoices ON Orders.OrderID = Invoices.OrderID
 GROUP BY Orders.OrderID, Orders.OrderTitle;
Run Code Online (Sandbox Code Playgroud)

结果在这里:
在此输入图像描述

我查看了多个SELECT语句,但我认为MS Access不支持这些语句

mwo*_*e02 3

子查询将为您提供您正在寻找的内容:

SELECT O.OrderID, O.OrderTitle, 
   (SELECT Sum(M.MaterialCost) FROM Materials AS M
    WHERE M.OrderID=O.OrderID) AS SumOfMaterialCost,
   (SELECT Sum(L.HoursTaken) FROM Labour AS L
    WHERE L.OrderID=O.OrderID) AS SumOfHoursTaken, 
   (SELECT Sum(I.InvoiceAmount) FROM Invoices AS I
    WHERE I.OrderID=O.OrderID)  AS SumOfInvoiceAmount
FROM Orders AS O
Run Code Online (Sandbox Code Playgroud)

有关更多有用信息,请参阅子查询基础知识幸存子查询。