在 Access 查询中获取重复记录

时间:2021-04-17 16:20:01

标签: sql ms-access

我有三个表:[库存快照] 表显示了产品的名称以及我们在现场的数量; [入站负载]表显示有多少进入; [出站路线]表列出了有多少人出站。

当我只有第一个和第二个表(显示在手和“到达”)时,我得到了唯一值,但是当我在第三个表中添加时,我开始得到多条记录而不是汇总记录。

查询目的

我在仓库工作,我正在尝试隔离 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 ) ); 

1 个答案:

答案 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
相关问题