2017-08-04 51 views
0

我正在寫一個存儲過程。存儲過程將清點所有庫存條目,並返回該產品所有單位的總成本等。我的產品和供應商信息分組,然後當它涉及到的數量和價值我有這個乘法總之

SELECT i.SupplierID, i.SupplierName, p.ProductID, p.ProductName, 
     SUM(i.Quantity) AS Quantity, 
     SUM(i.Quantity * i.UnitCost) AS TotalValue, 
     SUM(i.Quantity * i.UnitCost) OVER() AS AllProductsTotal 
FROM Inventory i 
JOIN Products p on p.ProductID = i.ProductID 
GROUP BY i.SupplierID, i.SupplierName, p.ProductID, p.ProductName 

然而,當我嘗試運行創造...

消息8120,16級,因爲它不是在聚合函數或GROUP BY子句中包含的狀態1,行2

列「Inventory.Quantity」在選擇列表中無效。因爲它不是在聚合函數或GROUP BY子句中包含

消息8120,級別16,狀態1,2號線

列「Inventory.UnitCost」在選擇列表中無效。

列處於一種聚集體,只有在聚集,它們僅僅是在同一集合在一起。我究竟做錯了什麼?

+0

應該「ie.ProductID」是「i.ProductID 「?在加入? – rjdevereux

+2

'SUM()OVER()'不是彙總 – Serg

+0

作爲@Serg說,也不會回到你想要的結果。你需要一個子查詢或其他'JOIN' –

回答

1

如果我這樣做是正確,你想一個窗口功能應用到總

SELECT i.SupplierID, i.SupplierName, p.ProductID, p.ProductName, 
     SUM(i.Quantity) AS Quantity, 
     SUM(i.Quantity * i.UnitCost) AS TotalValue, 
     SUM(SUM(i.Quantity * i.UnitCost)) OVER() AS AllProductsTotal 
FROM Inventory i 
JOIN Products p on p.ProductID = ie.ProductID 
GROUP BY i.SupplierID, i.SupplierName, p.ProductID, p.ProductName 
+0

沒有分區。該過程還需要返回所有行的總數(即窗口函數)庫存中所有產品的總值。 – Andrew

+0

刪除分區。我誤解了'產品所有單元的總成本'作爲按產品劃分的要求。 – Serg

0

您可以更改代碼如下


Select *, Sum(TotalValue) as AllProductsTotal over() 
from (
    SELECT i.SupplierID, i.SupplierName, p.ProductID, p.ProductName, 
     SUM(i.Quantity) AS Quantity, 
     SUM(i.Quantity * i.UnitCost) AS TotalValue--, 
     --SUM(i.Quantity * i.UnitCost) OVER() AS AllProductsTotal 
    FROM Inventory i 
    JOIN Products p on p.ProductID = ie.ProductID 
    GROUP BY i.SupplierID, i.SupplierName, p.ProductID, p.ProductName 
) a 
+0

是我肯定會刪除要求回報的一部分,得到它的工作,但後來我缺少報表需要這PROC會產生兩個值。 – Andrew

+0

無法理解您的評論.. –

+0

沒關係我誤解你的答案,我沒有注意到從子查詢中選擇,但我認爲順序應該是沒有經過別名之前。 – Andrew