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