Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 总和结果不正确的查询_Sql_Ms Access - Fatal编程技术网

Sql 总和结果不正确的查询

Sql 总和结果不正确的查询,sql,ms-access,Sql,Ms Access,我在MS Access 2007的数据库中有3个表PROGRAMA、TB_ONHAND和TB_BOM,TB_ONHAND存储物理库存值,TB_BOM存储生产机器所需的材料,PROGRAMA表存储日常生产计划 我在尝试对一个名为TOTAL的字段进行分组和求和时遇到问题 这是原始查询,但我得到了一些带有x2值的行,因为TB_手头上有两个相同的子项,因为该物料存储在两个不同的仓库中,我读到子查询解决了这一问题,但我不知道如何解决,我试图通过示例理解子查询,但仍然不知道如何在查询中添加子查询 SELEC

我在MS Access 2007的数据库中有3个表PROGRAMA、TB_ONHAND和TB_BOM,TB_ONHAND存储物理库存值,TB_BOM存储生产机器所需的材料,PROGRAMA表存储日常生产计划

我在尝试对一个名为TOTAL的字段进行分组和求和时遇到问题

这是原始查询,但我得到了一些带有x2值的行,因为TB_手头上有两个相同的子项,因为该物料存储在两个不同的仓库中,我读到子查询解决了这一问题,但我不知道如何解决,我试图通过示例理解子查询,但仍然不知道如何在查询中添加子查询

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];
但这是完全错误的,总共应该是41,我注意到这是因为在表TB_中,同一子项有两行,因为该物料存储在不同的仓库中

正确的结果应该是:

SUBITEM       Physical inventory    TOTAL   CORTOS
30-5865/01-801      5.00             41  -36
顺便说一句,几乎每个子项编号都有正确的总和,因为这些子项在TB_ONHAND中只出现一次,那些得到错误总和值的材料是因为它们在TB_ONHAND中有2行或更多行


我将非常感谢任何帮助,我的英语不是很好,所以我希望我的帖子是可以理解的。

正如您所说,子查询应该可以处理它。您可以尝试以下方法:

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的部分。这将避免在外部查询中为您提供完整的仓库信息的同时重复总计列的计算。

此解决方案使用子查询仅从现有tb_表中获取不同的结果,这将删除重复项:

SELECT 
TB_BOM.SUBITEM, 
TB_BOM.[SUBITEM DESCRIPTION], 
PROGRAMA.FECHA, 
TB_BOM.ITEMTYPE, 
distinct_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 (select distinct warehouse, [Item number] from TB_ONHAND where ((Warehouse)="301")) as distinct_TB_ONHAND ON TB_BOM.SUBITEM = distinct_TB_ONHAND.[Item number]

WHERE 
((PROGRAMA.FECHA)=[Buscar requerimento de material de la fecha: (mm/dd/aaaa)]))

GROUP BY 
TB_BOM.SUBITEM, 
TB_BOM.[SUBITEM DESCRIPTION], 
PROGRAMA.FECHA, TB_BOM.ITEMTYPE, 
distinct_TB_ONHAND.Warehouse, 
TB_BOM.[PLANNER NAME];
选择
TB_物料清单子项,
TB_物料清单【子项说明】,
程序a.FECHA,
TB_BOM.ITEMTYPE,
独特的现有仓库,

Sum(PROGRAMA.CANTIDAD*TB_BOM.[BUILD REQ])作为总计,您想要仓库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];

将代码直接写入您想要的内容可以使意图清晰、维护更容易,并且(通常但不总是)优化器能够提高性能。

好吧,您自己也说过,错误的结果是因为数据在
TB_ONHAND
表中出现两次,并且有不同的仓库。你应该选择哪一个?你甚至需要仓库信息吗?不清楚你的问题是什么。正如@Lamak所说的,您知道原因-那么此时您正在寻求什么样的帮助?total列在哪里?total列在子查询中的方式与最初相同:Sum(PROGRAMA.CANTIDAD*TB_BOM.[BUILD REQ])As total。
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];