2014-11-16 4 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 будет иметь много PackNoID с тем же ProductDesc (Part #)
  • Может быть несколько резервирований против того же 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

+0

Отредактировано OP, чтобы показать выборочные данные и ожидаемый результат @Squirrel – 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