查询错误的SUM结果

时间:2016-08-17 17:06:55

标签: sql ms-access

我在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行或更多行。

我会非常感激任何帮助,我的英语并不完美,所以我希望我的主题是可以理解的。

3 个答案:

答案 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];

直接将代码编写为您想要的内容,使意图变得清晰,维护更容易,并且(通常但并非总是如此)优化器能够提高性能。