Microsoft Access中由外键链接的值的求和

时间:2018-09-07 14:18:55

标签: ms-access

我正在努力创建查询或其他某种替代方法,该方法从外键相等的表的总和中得出平衡。

这是两个表结构:

产品线

ProductLineID      | AutoNumber
CompanyName        | Short Text
OrderID            | Number
ReferenceNumber    | Short Text
ProductDescription | Short Text
Quantity           | Number
PricePerUnit       | Currency
LineTotal          | Calculated
DueDate            | Date/Time

DeliveryLines

DeliveryLineID   | AutoNumber
DeliveryID       | Number
ProductLineID    | Number
DeliveryQuantity | Number

一个产品线可以有很多交付线,因此交付线中的外键

这是我到目前为止所拥有的:

SELECT [DeliveryLines].[ProductLineID], 
Sum([DeliveryLines]![DeliveryQuantity]) AS QuantityDelivered
FROM [DeliveryLines] GROUP BY [DeliveryLines].[ProductLineID];

这可以正确计算出每个产品线的总和。问题是我需要能够将其链接到[产品系列]。[ProductLineID],以便用户可以检索所有产品系列信息,并让其检索每个产品的余额(以及所有其他列)一。当产品线没有任何交货线时,我还需要有一个例外,最好显示[ProductLines]。[Quantity]。

任何帮助将不胜感激,

安迪

3 个答案:

答案 0 :(得分:0)

您需要的是一个简单的JOIN

SELECT ProductLines.ProductLineID, CompanyName, OrderID, [any other fields],
  SUM(Nz(DeliveryQuantity,0)) AS QuantityDelivered
FROM ProductLines
  LEFT JOIN DeliveryLines ON ProductLines.ProductLineID=DeliveryLines.ProductLineID
GROUP BY ProductLines.ProductLineID, CompanyName, OrderID, [any other fields]

仅当名称中包含空格或特殊字符时才需要使用方括号,并且当查询中的多个表具有相同名称的字段时,才需要字段的表名称。

您可以像这样使用GROUP BY来避免ProductLines中的每个字段FIRST

SELECT ProductLines.ProductLineID, FIRST(CompanyName) AS FirstCompanyName
…
GROUP BY ProductLines.ProductLineID

答案 1 :(得分:0)

找到解决方案:

SELECT
    [Product Lines].[Product Line ID]
  , [Product Lines].[Company Name]
  , [Product Lines].[Order ID]
  , [Product Lines].[Reference Number]
  , [Product Lines].[Product Description]
  , [Product Lines].[Quantity]
  , [Product Lines].[Price Per Unit]
  , [Product Lines].[Line Total]
  , [Product Lines].[Due Date]
  , SUM(Nz([Delivery Quantity],0)) AS QuantityDelivered
FROM
    [Product Lines]
    LEFT JOIN
        [Delivery Lines]
    ON
        [Product Lines].[Product Line ID] = [Delivery Lines].[Product Line ID]
GROUP BY
    [Product Lines].[Product Line ID]
  , [Product Lines].[Company Name]
  , [Product Lines].[Order ID]
  , [Product Lines].[Reference Number]
  , [Product Lines].[Product Description]
  , [Product Lines].[Quantity]
  , [Product Lines].[Price Per Unit]
  , [Product Lines].[Line Total]
  , [Product Lines].[Due Date]
;

它杂乱无章,蜿蜒曲折,但是有效。

答案 2 :(得分:0)

我的解决方案是将您的开始查询作为子查询,如果空值则替换QuantityDelivered

SELECT
    [ProductLines].[ProductLineID]
  , [ProductLines].[CompanyName]
  , [ProductLines].[OrderID]
  , [ProductLines].[ReferenceNumber]
  , [ProductLines].[ProductDescription]
  , [ProductLines].[PricePerUnit]
  , [ProductLines].[LineTotal]
  , [ProductLines].[DueDate]
  , Nz(t.QuantityDelivered,ProductLines.Quantity) AS Quantity
FROM
    ProductLines
    LEFT JOIN
        (
            SELECT
                [DeliveryLines].[ProductLineID]
              , SUM([DeliveryLines].[DeliveryQuantity]) AS QuantityDelivered
            FROM
                [DeliveryLines]
            GROUP BY
                [DeliveryLines].[ProductLineID]
        )
        AS t
    ON
        ProductLines.ProductLineID=t.ProductLineID