5

我花了 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;

结果:
在此处输入图像描述

基本上,我想要一个查询,它将汇总每个订单的每个材料、时间和发票。我根据需要在此电子表格中生成的内容可以在这里看到:
在此处输入图像描述

显然,这个 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;

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

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

4

1 回答 1

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

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

于 2012-10-11T12:37:07.533 回答