2013-04-04 37 views
0

我有這個查詢,我有一個收購表(傳入)和發票表(傳出)我試圖通過採取AVG dbo計算手頭的價值。 tblAcqDetail.AcqPrice * QtyOnHand這是計算採取傳入 - 傳出。當我在Acquisitions表中添加具有相同商品的不同費用的訂單項時,AVG不會分組,而是顯示下面的兩個訂單項。發貨方可以與多個訂單項正常工作...試圖計算手上的數量和手上的多個貨物的價值

Product QtyIn QtyOut On_Hand AVGPrice Value_OnHand 
Screws  100  30  70 25.0000  1750.0000 
Nuts  50  10  40 40.0000  1600.0000 
Nuts  100  10  90 50.0000  4500.0000 
Bolts  100  20  80 100.000  8000.0000 

SELECT DISTINCT 
     dbo.tblProduct.Product , 
     SUM(DISTINCT dbo.tblAcqDetail.AcqQuantity) AS QtyIN , 
     SUM(DISTINCT dbo.tblInvoiceDetail.InvQuantity) AS QtyOut , 
     SUM(DISTINCT dbo.tblAcqDetail.AcqQuantity) 
     - SUM(DISTINCT dbo.tblInvoiceDetail.InvQuantity) AS On_Hand , 
     dbo.tblAcqDetail.AcqPrice , 
     dbo.tblAcqDetail.AcqPrice 
     * (SUM(DISTINCT dbo.tblAcqDetail.AcqQuantity) 
      - SUM(DISTINCT dbo.tblInvoiceDetail.InvQuantity)) AS Value_Hand 
FROM dbo.tblAcq 
     INNER JOIN dbo.tblAcqDetail ON dbo.tblAcq.acqID = dbo.tblAcqDetail.AcqID 
     INNER JOIN dbo.tblProduct ON dbo.tblAcqDetail.ProductID = dbo.tblProduct.ProductID 
     INNER JOIN dbo.tblInvoiceDetail ON dbo.tblProduct.ProductID = dbo.tblInvoiceDetail.ProductID 
     INNER JOIN dbo.tblInvoice ON dbo.tblInvoiceDetail.InvoiceID = dbo.tblInvoice.InvoiceID 
GROUP BY dbo.tblProduct.Product , 
     dbo.tblAcqDetail.AcqPrice 

回答

0

要在數學上準確,你不應該使用SUM(DISTINCT fieldname),只是SUM(fieldname)。否則,它將消除碰巧具有相同數量的條目。

對於這個問題,你不應該在查詢開始時使用DISTINCTGROUP BY已經處理了。

如果您認爲您的JOIN返回了重複的行(如果您正確的話,您應該不會這麼做),請在使用DISTINCT的子查詢中將它們包裝在試圖進行聚合之前。

舉個例子,以消除重複子查詢可以寫成像這樣:

SELECT 
    Product , 
    SUM(AcqQuantity) AS QtyIN , 
    SUM(InvQuantity) AS QtyOut , 
    SUM(AcqQuantity) 
    - SUM(InvQuantity) AS On_Hand , 
    AcqPrice , 
    AcqPrice 
    * (SUM(AcqQuantity) 
     - SUM(InvQuantity)) AS Value_Hand 
FROM (SELECT DISTINCT 
      dbo.tblProduct.Product , 
      dbo.tblAcqDetail.AcqQuantity, 
      dbo.tblInvoiceDetail.InvQuantity, 
      dbo.tblAcqDetail.AcqPrice 
     FROM 
      dbo.tblAcqDetail 
      INNER JOIN dbo.tblProduct ON dbo.tblAcqDetail.ProductID = dbo.tblProduct.ProductID 
      INNER JOIN dbo.tblInvoiceDetail ON dbo.tblProduct.ProductID = dbo.tblInvoiceDetail.ProductID 
      INNER JOIN dbo.tblInvoice ON dbo.tblInvoiceDetail.InvoiceID = dbo.tblInvoice.InvoiceID) productInfo 
GROUP BY Product, AcqPrice 
+0

我嘗試沒有獨特的,它爲同一產品返回多行。 – Johanna 2013-04-04 16:51:35

+0

我找不出原因。行不重複,它不會正確分組或合併它們。看到上面表格的輸出。如果我作爲子查詢打包在DISTINCT中仍然不起作用。 – Johanna 2013-04-04 17:00:34

+0

@ user2245667:嘗試從JOIN中刪除'tblAcq'表 - 它不在任何地方使用。如果您可以單獨發佈每個表的一些示例數據,它也會有所幫助... – PinnyM 2013-04-04 17:11:49

0

基礎上PinnyM的答案,你不需要DISTINCT,我重新寫你的查詢作爲使用表的別名如下:


SELECT 
     P.Product , 
     SUM(AcD.AcqQuantity) AS QtyIN , 
     SUM(InD.InvQuantity) AS QtyOut , 
     SUM(AcD.AcqQuantity) 
     - SUM(InD.InvQuantity) AS On_Hand , 
     AcD.AcqPrice , 
     AcD.AcqPrice 
     * (SUM(AcD.AcqQuantity) 
      - SUM(InD.InvQuantity)) AS Value_Hand 
FROM dbo.tblAcq Ac 
     INNER JOIN dbo.tblAcqDetail AcD ON Ac.acqID = AcD.AcqID 
     INNER JOIN dbo.tblProduct P ON AcD.ProductID = P.ProductID 
     INNER JOIN dbo.tblInvoiceDetail InD ON P.ProductID = InD.ProductID 
     INNER JOIN dbo.tblInvoice Inv ON InD.InvoiceID = Inv.InvoiceID 
GROUP BY P.Product , 
     AcD.AcqPrice 

通過閱讀此查詢,我不明白爲什麼你需要的表dbo.tblInvoice,它不是集合的一部分。

您仍然看到不同產品的原因是因爲您按兩列P.Product, AcD.AcqPrice組合,不僅產品,在您的返回結果中,您可以看到它們的組合是唯一的。