2016-08-17 5 views
-1

MS Access 2007의 데이터베이스에 3 개의 테이블 PROGRAMA, TB_ONHAND 및 TB_BOM이 있으며 TB_ONHAND는 실제 재고 값을 저장하고 TB_BOM은 기계를 생산하는 데 필요한 자재를 저장하며 PROGRAMA 테이블은 일일 생산량을 저장합니다 프로그램.잘못된 SUM 결과가있는 쿼리

TOTAL이라는 그룹 필드와 SUM을 그룹화하려고 할 때 문제가 있습니다.

이것은 원래 쿼리입니다.하지만 그 자료가 두 개의 다른 창고에 저장되어 있기 때문에 TB_ONHAND에 동일한 SUBITEM이 두 번 있기 때문에 x2 값을 가져 오는 행이 있습니다. 하위 쿼리로 해결되지만 읽지 않았습니다. 내가 FECHA 같은 일부 필드를 삭제하는 것이

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

이 쿼리 결과 (주 아이디어는 어떻게 임 예제와 함께 하위 쿼리를 이해하려고 노력하지만, 여전히 실마리가 내 쿼리 하위 쿼리를 추가하지 않습니다 어떻게 나타내고 itemtype, 창고, PLANNER 아이템 번호와 합계 값을 표시하기위한 NAME) :

SUBITEM  Physical inventory TOTAL CORTOS 
30-5865/01-801  5.00    82 -77 

하지만 완전히 잘못되면 41 개를 합계해야합니다. TB_ONHAND 테이블에 동일한 SUBITEM에 2 개의 행이 있으므로 그 이유는 이것이 다른 창고에 저장되어 있기 때문입니다.

올바른 결과가 있어야한다 : 그 하위 항목은 한 번만 TB_ONHAND에서 나타나기 때문에

SUBITEM  Physical inventory TOTAL CORTOS 
30-5865/01-801  5.00    41 -36 

가 BTW 나는 그들이 2 개 이상을 가지고 있기 때문에 잘못된 합계 값을 가져 그 재료는, 거의 모든 하위 항목 번호로 정확한 금액을 얻을 행은 TB_ONHAND에 있습니다.

나는 어떤 도움을 주어도 대단히 감사 할 것입니다. 제 영어 실력이 완벽하지 않아서 실을 이해할 수 있기를 바랍니다.

+1

음, 데이터 자체가 다른 창고가있는 TB_ONHAND 테이블에 두 번 나타나기 때문에 잘못된 결과가 발생했습니다. 어느 쪽을 선택해야합니까? 창고 정보가 필요합니까? – Lamak

+0

귀하의 질문에 대한 명확하지 않습니다. @Lamak이 말했듯이, 당신은 그 원인을 알고 있습니다 - 그래서 어떤 종류의 도움을 원하십니까? – Nicarus

답변

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를 계산하는 부분을 제거하십시오. 이렇게하면 외부 열에 전체웨어 하우스 정보를 제공하면서 총 열에 대한 계산을 중복하지 않게됩니다. 조인 제거하고 당신이 원하는 쓰기 얻을 -

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]; 
+0

전체 열은 어디에 있습니까? – TPhe

+0

전체 열은 원래와 같은 방식으로 하위 쿼리에 있습니다. Sum (PROGRAMA.CANTIDAD * TB_BOM. [BUILD REQ]) AS TOTAL. – JJ32

0

이 솔루션은 중복을 제거해야하는의 tb_OnHand 테이블 만 별개의 결과를 얻으려면 하위 쿼리를 사용하여 다음은 직접 당신이 의도를 명확하게 원하는에 코드를 작성

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

작동하는 방법을 명확 쉽게 유지 보수 및 성능을 향상시킬 수 (종종 항상은 아니지만) 최적화.

0

당신은 창고 (301)에서 물건을 원하는가 :