我在MS Access 2007的数据库中有3个表PROGRAMA,TB_ONHAND和TB_BOM,TB_ONHAND存储物理库存值,TB_BOM存储生产机器所需的材料,PROGRAMA表存储每日生产程序。
尝试对一个名为TOTAL的字段进行分组和SUM时遇到问题。
这是原始查询,但由于TB_ONHAND具有相同的SUBITEM两次,因为该材料存储在两个不同的仓库中,我得到一些x2值的行,我已经读过这是用子查询修复但我不知道如何,我试图用例子来理解子查询,但仍然不知道我将如何在我的查询中添加子查询
SELECT
TB_BOM.SUBITEM,
TB_BOM.[SUBITEM DESCRIPTION],
PROGRAMA.FECHA,
TB_BOM.ITEMTYPE,
TB_ONHAND.Warehouse,
Sum(PROGRAMA.CANTIDAD*TB_BOM.[BUILD REQ]) AS TOTAL, <---This is the value I get incorrect in some cases.
TB_BOM.[PLANNER NAME]
FROM
(PROGRAMA LEFT JOIN TB_BOM ON PROGRAMA.ITEM = TB_BOM.BOM)
LEFT JOIN TB_ONHAND ON TB_BOM.SUBITEM = TB_ONHAND.[Item number]
WHERE
(((PROGRAMA.FECHA)=[Buscar requerimento de material de la fecha: (mm/dd/aaaa)]) AND ((TB_ONHAND.Warehouse)="301"))
GROUP BY
TB_BOM.SUBITEM,
TB_BOM.[SUBITEM DESCRIPTION],
PROGRAMA.FECHA, TB_BOM.ITEMTYPE,
TB_ONHAND.Warehouse,
TB_BOM.[PLANNER NAME];
这是查询结果(请注意,我删除了一些字段,如FECHA,ITEMTYPE,WAREHOUSE,PLANNER NAME,只是为了显示商品编号和总和值):
SUBITEM Physical inventory TOTAL CORTOS
30-5865/01-801 5.00 82 -77
但它完全错了它应该总和41,我已经注意到这是因为在TB_ONHAND表中相同的SUBITEM有两行,因为该材料存储在不同的仓库中。
正确的结果应该是:
SUBITEM Physical inventory TOTAL CORTOS
30-5865/01-801 5.00 41 -36
顺便说一下,我得到的每个Subitem数字几乎都是正确的,因为这些子项在TB_ONHAND中只出现一次,那些得到错误的Sum值的材料是因为它们在TB_ONHAND中有2行或更多行。
我会非常感激任何帮助,我的英语并不完美,所以我希望我的主题是可以理解的。
答案 0 :(得分:0)
正如您所说,子查询应该处理它。你会尝试这样的事情:
SELECT SUBITEM, [SUBITEM DESCRIPTION], FECHA, ITEMTYPE,
TOTAL, [PLANNER NAME], TB_ONHAND.Warehouse
FROM
(SELECT
TB_BOM.SUBITEM,
TB_BOM.[SUBITEM DESCRIPTION],
etc...) SUBQUERY1
LEFT JOIN TB_ONHAND ON SUBQUERY1.SUBITEM = TB_ONHAND.[Item number]
WHERE ((TB_ONHAND.Warehouse)="301")
删除内部查询中计算TB_ONHAND.Warehouse的部分。这样可以避免在总列上重复计算,同时仍然在外部查询中提供完整的仓库信息。
答案 1 :(得分:0)
此解决方案使用子查询仅获取tb_OnHand表中的不同结果,这将删除重复项:
v2 = [ (c+d) + (d-c)* [(2*v1 – (a+b)) / (b-a)] ] / 2
答案 2 :(得分:0)
你想要仓库中的东西301 - 摆脱连接并写下你想要的东西然后很清楚如何让它工作
SELECT
TB_BOM.SUBITEM,
TB_BOM.[SUBITEM DESCRIPTION],
PROGRAMA.FECHA,
TB_BOM.ITEMTYPE,
TB_ONHAND.Warehouse,
Sum(PROGRAMA.CANTIDAD*TB_BOM.[BUILD REQ]) AS TOTAL,
TB_BOM.[PLANNER NAME]
FROM PROGRAMA
LEFT JOIN TB_BOM ON PROGRAMA.ITEM = TB_BOM.BOM
WHERE PROGRAMA.FECHA=[Buscar requerimento de material de la fecha: (mm/dd/aaaa)]
AND TB_BOM.SUBITEM IN (SELECT [Item number] FROM TB_ONHAND WHERE Warehouse="301")
GROUP BY
TB_BOM.SUBITEM,
TB_BOM.[SUBITEM DESCRIPTION],
PROGRAMA.FECHA,
TB_BOM.ITEMTYPE,
TB_BOM.[PLANNER NAME];
直接将代码编写为您想要的内容,使意图变得清晰,维护更容易,并且(通常但并非总是如此)优化器能够提高性能。