MS Access 2010查询多次提取相同记录,sql挑战

MS Access 2010查询多次提取相同记录,sql挑战,sql,ms-access,Sql,Ms Access,我目前正在使用ms Access 2010开发一个跟踪公司库存的程序。我很难获得用于显示库存的查询来显示我想要的信息。问题似乎在于,查询多次提取同一条记录,从而夸大了保留产品和售出产品的总和 背景: 我公司储备钢筋。我们提议把钢筋切成小块。从库存方面来说,我们希望跟踪每根棒材的长度,从它进入仓库的那一刻起,到它在仓库中的时间(在那里它可能被切成小块),直到整个棒材被出售并消失 数据库: 查询给出的问题,是查阅3个表 棒料(具有以下字段) 批次号(接收的所有棒材,属于同一生产炉) 巴诺(个人酒

我目前正在使用ms Access 2010开发一个跟踪公司库存的程序。我很难获得用于显示库存的查询来显示我想要的信息。问题似乎在于,查询多次提取同一条记录,从而夸大了保留产品和售出产品的总和

背景: 我公司储备钢筋。我们提议把钢筋切成小块。从库存方面来说,我们希望跟踪每根棒材的长度,从它进入仓库的那一刻起,到它在仓库中的时间(在那里它可能被切成小块),直到整个棒材被出售并消失

数据库: 查询给出的问题,是查阅3个表

  • 棒料(具有以下字段)
    • 批次号(接收的所有棒材,属于同一生产炉)
    • 巴诺(个人酒吧)
    • 初始长度(在库存处收到的棒的长度
(BatchNumber和BarNo的组合是主键)

  • 销售

    • ID(主键)
    • 批次号
    • 巴诺
    • 销售量
  • 预订(当客户表示有兴趣,但需要时间决定时,卖家可以预订一些材料)

    • ID(主键)
    • 批次号
    • 巴诺
    • 保留数量
我想将三个表中的信息拉到一个列表中,该列表显示: -棒料。收到时的初始长度 -销售额。按销售额出售的数量 -收到-作为库存出售 -保留。保留为保留的数量 -库存-保留为可用

问题是我不擅长sql。我已经尽我所能研究了union和inner join,但我的努力都白费了。我通常依靠设计视图来生成我需要的sql语句。通过设计视图,我提出了以下sql:

SELECT 
  BarStock.BatchNo
  , BarStock.BarNo
  , First(BarStock.OrgLength) AS Recieved
  , Sum(Sales.QtySold) AS SumAvQtySold
  , [Recieved]-[SumAvQtySold] AS [On Stock]
  , Sum(Reservation.QtyReserved) AS Reserved
  , ([On Stock]-[Reserved])*[Skjemaer]![Inventory]![unitvalg] AS Available
FROM 
  (BarStock 
    INNER JOIN Reservation ON (BarStock.BarNo = Reservation.BarNo) AND (BarStock.BatchNo = Reservation.BatchNo)
  ) 
    INNER JOIN Sales ON (BarStock.BarNo = Sales.BarNo) AND (BarStock.BatchNo = Sales.BatchNo)
GROUP BY 
  BarStock.BatchNo
  , BarStock.BarNo
我知道查询多次拉取同一条记录,因为; -当我按项删除组时,我会得到几个完全相同的记录。 -但是,在相应的表中只有这些记录的一个实例

我希望我能正确地解释我自己,请问我是否需要详细说明什么


感谢您抽出时间来查看我的问题!

!!!检查一些假设

从数据库模式来看,似乎:

  • 对于给定的
    BatchNumber/BarNo
    ,可能会有多个
    销售记录(例如,我可以想象多个客户可能购买了同一条线的分段)
  • 对于给定的
    BatchNumber/BarNo
    ,可能有多条
    保留
    记录(例如,同一条的多个部分可以“保留”)
要检查这些表中是否确实有多条记录,请尝试以下操作:

SELECT CountOfDuplicates
FROM   (SELECT COUNT(*) AS CountOfDuplicates
        FROM   Sales
        GROUP  BY BatchNumber & "," & BarNo)
WHERE  CountOfDuplicates > 1 
SELECT BarID,
       Sum(Quantity)
FROM   StockTransaction
GROUP BY BarID
如果查询返回一些记录,则会有重复的记录,这可能就是查询返回错误值的原因

从头开始 现在,让您的查询正常工作的诀窍是真正思考您想要显示的主要数据是什么,然后从这一点开始:

  • 你基本上想要一份库存中所有酒吧的清单。 这些酒吧中的一些可能已经售出,或者已经预订,但如果没有,你应该显示库存量。你当前的查询永远不会显示这一点
  • 对于库存中的每个酒吧,您希望列出已售出的数量和保留的数量,并将它们组合起来以找出剩余的可用数量
很明显,你的中心数据是库存酒吧的列表

与其尝试直接将所有内容都放到一个大型查询中,不如为每个目标创建简单的查询,并确保在每种情况下都能获得正确的数据

只有酒吧 根据您的解释,每个单独的酒吧都记录在
BarStock
表中。
正如我在评论中所说的,据我所知,所有交付的酒吧在
酒吧库存
表中都有一条记录,没有重复记录。因此,衡量库存的主要依据是
酒吧库存
表:

SELECT BatchNumber, 
       BarNo, 
       OrgLength
FROM   BarStock
只是销售 同样,这应该非常简单:我们只需要找出每对
BatchNumber/BarNo
的总长度:

SELECT BatchNumber, 
       BarNo, 
       Sum(QtySold) AS SumAvQtySold
FROM   Sales
GROUP BY BatchNumber, BarNo
只是预订 与销售相同:

SELECT BatchNumber,
       BarNo,
       SUM(QtyReserved) AS Reserved
FROM   Reservation
GROUP  BY BatchNumber, BarNo 
原始库存与销售额之比 现在,我们应该能够将前两个查询合并为一个查询。我不是在尝试优化,只是为了让数据协同工作:

SELECT BarStock.BatchNumber,
       BarStock.BarNo,
       BarStock.OrgLength,
       S.SumAvQtySold,
       (BarStock.OrgLength - Nz(S.SumAvQtySold)) AS OnStock
FROM   BarStock
LEFT JOIN (SELECT BatchNumber,
                  BarNo,
                  Sum(QtySold) AS SumAvQtySold
           FROM   Sales
           GROUP  BY BatchNumber, BarNo) AS S
  ON (BarStock.BatchNumber = S.BatchNumber) AND (BarStock.BarNo = S.BarNo) 
我们做了一个
左连接
,因为库存中可能有尚未售出的酒吧。
如果我们做了一个
内部连接
,我们会在最终报告中遗漏这些,这让我们相信这些条从一开始就不存在

全部 现在,我们可以将整个查询包装在另一个
左连接中,与保留条相对,以获得最终结果:

SELECT BS.BatchNumber,
       BS.BarNo,
       BS.OrgLength,
       BS.SumAvQtySold,
       BS.OnStock,
       R.Reserved,
       (OnStock - Nz(Reserved)) AS Available
FROM   (SELECT BarStock.BatchNumber,
               BarStock.BarNo,
               BarStock.OrgLength,
               S.SumAvQtySold,
               (BarStock.OrgLength - Nz(S.SumAvQtySold)) AS OnStock
        FROM   BarStock
        LEFT JOIN (SELECT BatchNumber,
                          BarNo,
                          SUM(QtySold) AS SumAvQtySold
                   FROM   Sales
                   GROUP  BY BatchNumber,
                             BarNo) AS S
          ON (BarStock.BatchNumber = S.BatchNumber) AND (BarStock.BarNo = S.BarNo)) AS BS
LEFT JOIN (SELECT BatchNumber,
                  BarNo,
                  SUM(QtyReserved) AS Reserved
           FROM   Reservation
           GROUP  BY BatchNumber,
                     BarNo) AS R
  ON (BS.BatchNumber = R.BatchNumber) AND (BS.BarNo = R.BarNo) 
注意
Nz()的用法
对于联接右侧的项目:如果给定的
BatchNumber/BarNo
对没有
Sales
Reservation
数据,则
SumAvQtySold
Reserved
的值将
Null
并将
OnStock
Available
Null,regardless的实际库存量,这将不是我们预期的结果

使用Access中的查询设计器,您必须分别创建3个查询,然后将它们组合起来。
请注意,尽管设计的查询在处理多个
LEFT
RIGHT
联接方面不是很好,但我认为您不可能一次就完成全部工作

一些评论 我相信你应该阅读@Remou在他的社区里给你的信息