2014-11-16 2 views
0

본질적으로 재고가 준비되어 있고, 주문 중이며, 표시가있는 디스플레이 쿼리가 있습니다. 한 부분을 제외하고는 모두 괜찮습니다. 무게와 양의 합계가 두 배로 된 결과를 반환합니다 (일부 금액이 주문 된 경우에만 해당). 내 조인을 채웠다 고 확신하지만 어떻게 될지 알 수 없습니다. (배 합)SQL OUTER JOIN 열 합계가 두 배로 반환됩니다.

전류 출력 :

PartNo      Branch SOHWeight SOHQty ReservedQty SOOEa SOOTo AvgCost type product grade coating finish thickness width length dim1 dim2 Notes                                                               ClassFBR ClassFME ClassFSY AltoQty 
-------------------------- ------ --------- ------ ----------- ----- ----- ------- ---- ------- ----- ------- ------ --------- ----- ------ ---- ---- ----- 
B-254-304---5--40-40-6000 FME 0.33  18  NULL  NULL 1.5 68.7494 B ANGLE-E 304   NULL 5   NULL 6000 40 40 NULL                                                                C  A  B  NULL 
Warning: Null value is eliminated by an aggregate or other SET operation. 

예상 출력 SOHWeight 및 SOHQty가 절반 (출력 전류에 비해)되어야한다는 것을 제외하고는 정확하게 동일한

주 :

  • StockOnHand에는 동일한 ProductDesc (부품 번호)가있는 많은 PackNoID가 있습니다.
  • 여러 예약이있을 수 있습니다 동일한 PackNoID 대해
SELECT dbo.tblProducts.PartNo, 
     'FME'                                                AS Branch, 
     SUM(sOh.Weight)                                              AS SOHWeight, 
     SUM(sOh.Quantity)                                             AS SOHQty, 
     SUM(dbo.tblReserveDetail.Quantity)                                         AS ReservedQty, 
     SUM(iif(dbo.tblPurchaseOrderDetail.QuantityUnit = 'TO', NULL, dbo.tblPurchaseOrderDetail.QuantityAmount))                       AS SOOEa, 
     SUM(iif(dbo.tblPurchaseOrderDetail.QuantityUnit = 'TO', dbo.tblPurchaseOrderDetail.QuantityAmount, NULL))                       AS SOOTo, 
     SUM(IIF(SoH.TYPE IN ('C', 'SC'), SoH.COST * SoH.WEIGHT, SoH.COST * SoH.QUANTITY) + PROCESSINGCOST + PROCESSINGFREIGHT + Packaging)/SUM(IIF(SoH.TYPE IN ('C', 'SC'), sOh.weight, sOh.Quantity)) AS AvgCost, 
     tblProducts.type, 
     tblProducts.product, 
     tblProducts.grade, 
     tblProducts.coating, 
     tblProducts.finish, 
     tblProducts.thickness, 
     tblProducts.width, 
     tblProducts.length, 
     tblProducts.dim1, 
     tblProducts.dim2, 
     tblProducts.Notes, 
     tblProducts.ClassFBR, 
     tblProducts.ClassFME, 
     tblProducts.ClassFSY, 
     SUM(IIF(SoH.STATUS = 'SC', SoH.QUANTITY, NULL))                                      AS AltoQty 
FROM DBO.tblProducts 
     LEFT OUTER JOIN dbo.tblStockOnHand SoH 
     ON tblProducts.PartNo = SOH.ProductDesc 
      AND SoH.Status IN ('I', 'R', 'SC') 
      AND SoH.branch = 'FME' 
     LEFT OUTER JOIN dbo.tblReserveDetail 
         RIGHT OUTER JOIN dbo.tblReserveHeader 
         ON dbo.tblReserveHeader.ID = dbo.tblReserveDetail.ReserveID 
          AND tblReserveHeader.Completed = 0 
          AND tblReserveHeader.Cancelled = 0 
     ON SOH.PACKNOID = tblReserveDetail.PacknoID 
     LEFT OUTER JOIN tblPurchaseOrderDetail 
     ON dbo.tblPurchaseOrderDetail.ProductDesc = dbo.tblProducts.PartNo 
      AND (dbo.tblPurchaseOrderDetail.Status = N'O' 
        OR dbo.tblPurchaseOrderDetail.Status = N'PD') 
      AND tblPurchaseOrderDetail.branch = 'FME' 
GROUP BY dbo.tblProducts.PartNo, 
      tblProducts.type, 
      tblProducts.product, 
      tblProducts.grade, 
      tblProducts.coating, 
      tblProducts.finish, 
      tblProducts.thickness, 
      tblProducts.width, 
      tblProducts.length, 
      tblProducts.dim1, 
      tblProducts.dim2, 
      tblProducts.Notes, 
      tblProducts.ClassFBR, 
      tblProducts.ClassFME, 
      tblProducts.ClassFSY 

샘플 데이터 (벗었) tblStockOnHand :

PackNoID Status Weight Quantity Cost ProcessingCost ProcessingFreight Packaging Branch tblstockonhand.ProductDesc 
157220 I 0.165 9 $68.47 $0.00 $2.48 $0.00 FME B-254-304---5--40-40-6000 
158620 I 0.01839825 1 $64.27 $0.00 $4.72 $0.00 FSY B-254-304---5--40-40-6000 

tblPurchaseOrderDetail

RecordId Status OrderNumber ItemNumber QuantityAmount QuantityUnit PriceQuantity PriceUnit Branch ProductDesc 
6976 FD 4441 18 0.25 TO 3790 TO FBR B-254-304---5--40-40-6000 
6936 O 4439 23 0.5 TO 3790 TO FME B-254-304---5--40-40-6000 
6912 FD 4437 1 20 EA 75.96 EA FSY B-254-304---5--40-40-6000 

tblPurchaseOrderHeader

을 오른쪽 외부 조인 세부 사항을보고하지 않고
Status OrderNumber Branch 
O 4439 FME 

tblProducts

PartNo ClassFBR ClassFME ClassFSY Notes Type Product Grade Finish Coating Thickness Width Length Dim1 Dim2 
B-254-304---5--40-40-6000 C A B  B ANGLE-E 304   5  6000 40 40 
+0

@Squirrel – Squirrel

+0

편집 영업 이익을 게시하시기 바랍니다. ( – JCro

답변

0

의심이다. 오른쪽 외부 조인은 항상 왼쪽 외부 조인으로 바꿀 수 있으며, 둘 다 함께 사용하면 혼동스러운 쿼리가 생성 될 수 있습니다. 이것이 이중 결과의 원인 일 가능성이 높습니다. 모든 조인이 조합이 아닌 외부에 남도록 리팩토링을 시도하십시오.

+0

이 시도 샘플 데이터와 예상되는 결과, 동일한 결과 불행하게도을 보여 일부 샘플 데이터와 예상 된 결과 – JCro

+0

@JCro 아래의 최종 해결책에서 더 이상 바깥 쪽 조인을하지 않습니다. –

0

마침내 알 수 있듯이 OUTER에 합류하기 전에 조인을 서브 쿼리해야합니다. 그렇지 않으면 그룹화/합계 대신 리턴 된 각 레코드에 대해 합계가 계산됩니다. 내가 아는 끔찍한 설명이지만 여기에 최종 결과 쿼리가 있습니다. 외모를 가진 사람 덕분에.

SELECT dbo.tblProducts.PartNo, 'FME' AS Branch, SUM(sOh.Weight) AS SOHWeight, SUM(sOh.Quantity) AS SOHQty, 
     ReservedQty, SOOEa,SOOTo 
     ,sum(IIF(SoH.TYPE IN ('C','SC'),SoH.COST*SoH.WEIGHT,SoH.COST*SoH.QUANTITY)+soh.PROCESSINGCOST+soh.PROCESSINGFREIGHT+soh.Packaging)/SUM(IIF(SoH.TYPE IN ('C','SC'),sOh.weight,sOh.Quantity)) AS AvgCost 
     ,tblProducts.type,tblProducts.product,tblProducts.grade,tblProducts.coating,tblProducts.finish,tblProducts.thickness,tblProducts.width,tblProducts.length,tblProducts.dim1,tblProducts.dim2,tblProducts.Notes,tblProducts.ClassFBR,tblProducts.ClassFME,tblProducts.ClassFSY 
     ,SUM(IIF(SoH.STATUS='SC',SoH.QUANTITY,NULL)) AS AltoQty 
FROM 
     dbo.tblProducts 
     LEFT OUTER JOIN 
     dbo.tblStockOnHand SoH 
     ON tblProducts.PartNo = SOH.ProductDesc AND SoH.Status IN ('I', 'R','SC') AND SoH.branch='FME' 
     LEFT OUTER JOIN 
      (SELECT SUM(tblReserveDetail.Quantity) AS ReservedQty, ProductDesc 
      FROM dbo.tblReserveDetail INNER JOIN tblReserveHeader ON dbo.tblReserveHeader.ID = dbo.tblReserveDetail.ReserveID INNER JOIN tblStockOnHand ON tblReserveDetail.PacknoID=tblStockOnHand.PackNoID 
      WHERE tblReserveHeader.Completed=0 AND tblReserveHeader.Cancelled =0 AND BRANCH='FME' 
      GROUP BY ProductDesc) RES 
     ON SoH.ProductDesc = RES.ProductDesc 
     LEFT OUTER JOIN 
      (SELECT tblPurchaseOrderDetail.ProductDesc,SUM(iif(QuantityUnit='TO',null,QuantityAmount)) AS SOOEa,SUM(iif(QuantityUnit='TO',QuantityAmount,null)) AS SOOTo 
      FROM tblPurchaseOrderDetail WHERE 
      (dbo.tblPurchaseOrderDetail.Status = N'O' OR dbo.tblPurchaseOrderDetail.Status = N'PD') AND tblPurchaseOrderDetail.branch='FME' 
      GROUP BY tblPurchaseOrderDetail.ProductDesc) PoD 
     ON PoD.ProductDesc = dbo.tblProducts.PartNo 
GROUP BY dbo.tblProducts.PartNo,tblProducts.type,tblProducts.product,tblProducts.grade,tblProducts.coating,tblProducts.finish,tblProducts.thickness,tblProducts.width,tblProducts.length,tblProducts.dim1,tblProducts.dim2,tblProducts.Notes,tblProducts.ClassFBR,tblProducts.ClassFME,tblProducts.ClassFSY,SOOEa,SOOTo,ReservedQty