我正在努力创建查询或其他某种替代方法,该方法从外键相等的表的总和中得出平衡。
这是两个表结构:
产品线
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]。
任何帮助将不胜感激,
安迪
答案 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