2017-08-04 53 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