我有三个表:[库存快照] 表显示了产品的名称以及我们在现场的数量; [入站负载]表显示有多少进入; [出站路线]表列出了有多少人出站。
当我只有第一个和第二个表(显示在手和“到达”)时,我得到了唯一值,但是当我在第三个表中添加时,我开始得到多条记录而不是汇总记录。
我在仓库工作,我正在尝试隔离 1) 库存不足的拣货槽; 2)没有更多的产品进来; 3) 我想知道是否有未结订单可以发货任何剩余产品。
SELECT DISTINCT [inventory snapshot].locn_brcd,
[inventory snapshot].description,
[inventory snapshot].item_name,
Sum([inventory snapshot].on_hand_qty) AS SumOfON_HAND_QTY,
Sum([outbound routes].quantity) AS SumOfQuantity
FROM [outbound routes]
RIGHT JOIN ([inbound loads]
RIGHT JOIN [inventory snapshot]
ON [inbound loads].[wrin number] =
[inventory snapshot].item_name)
ON [outbound routes].[wrin number] =
[inventory snapshot].item_name
GROUP BY [inventory snapshot].locn_brcd,
[inventory snapshot].description,
[inventory snapshot].item_name,
[inbound loads].[quantity to receive]
HAVING ( ( ( Sum([inventory snapshot].on_hand_qty) ) < 10 )
AND ( ( [inbound loads].[quantity to receive] ) IS NULL ) );
答案 0 :(得分:0)
既然您解决了问题,请考虑进一步调整分组列。现在,GROUP BY
子句比 SELECT
子句多包含一个字段,即:[inbound loads].[quantity to receive]
。
通常,在这样的聚合 SQL 查询中,诸如数量之类的数值不会分组,而是作为聚合列运行。您可能已将它添加到 GROUP BY
以便在 HAVING
中使用它。但是,可以在 WHERE
中处理非聚合以在聚合之前进行过滤。 (奇怪的是,MS Access 倾向于使用查询设计在 HAVING
中移动这种级别过滤。)
考虑下面使用表别名来避免重复长表名的重构 SQL。当然,删除不必要的位置分组。
SELECT s.locn_brcd
, s.description
, s.item_name
, SUM(s.on_hand_qty) AS SumOfON_HAND_QTY
, SUM(r.quantity) AS SumOfQuantity
FROM [outbound routes] r
RIGHT JOIN ([inbound loads] l
RIGHT JOIN [inventory snapshot] s
ON l.[wrin number] = s.item_name)
ON r.[wrin number] = s.item_name
WHERE l.[quantity to receive] IS NULL
GROUP BY s.locn_brcd
, s.description
, s.item_name
HAVING SUM(s.on_hand_qty) < 10 ;
顺便说一下,SQL 行业倾向于使用 LEFT JOIN
而不是 RIGHT JOIN
来提高可读性,您可能无法控制,因为此查询可能是从 Query Design 输出的。在 Access SQL 中需要括号的地方尝试不嵌套 JOIN
的等效版本:
FROM ([inventory snapshot] s
LEFT JOIN ([inbound loads] l
ON l.[wrin number] = s.item_name)
LEFT JOIN [outbound routes] r
ON r.[wrin number] = s.item_name