2013-05-16 72 views
0

我有一个数据集,我必须在每一个价格出售这样的项目ID,然后数量:聚合函数我创建

ItemID | Quantity | Price 
ABC  10   14.50 
ABC  4   14.25 
DEF  32   22.41 
ABC  24   14.10 
GHI  8   8.50 
GHI  12   8.60 
DEF  2   22.30 

每个条目都有项目ID和价格的独特组合。我想添加第四栏,其中包含为该ItemID销售的总数量。所以它看起来像这样上表:

ItemID | Quantity | Price | TotalQ 
ABC  10   14.50  38 
ABC  4   14.25  38 
DEF  32   22.41  34 
ABC  24   14.10  38 
GHI  8   8.50  20 
GHI  12   8.60  20 
DEF  2   22.30  34 

我似乎无法做到这一点没有上一个聚合函数,这显然给出了一个错误执行聚合函数。我将如何去完成这件事?

我使用SQL Server 2008的

+0

你怎么知道TotalQ?你可以编写一个函数来计算TotalQ。 – Matheno

+0

这听起来像是我正在寻找的。我对SQL很陌生,所以我不知道如何编写这样的函数。 – weskpga

回答

4

请尝试:

SELECT 
    *, 
    SUM(Quantity) OVER(PARTITION BY ItemID) TotalQ 
FROM 
    YourTable 
+0

出现错误: 消息8120,级别16,状态1,行24 列'server.Quantity'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 – weskpga

+0

@weskpga - 如果您在另一个已经按“ItemID,Price”分组的查询的上下文中使用此属性,则可能需要SUM(SUM([Quantity]))OVER(PARTITION BY [ItemID])AS TotalQ'。向我们展示原始查询而不仅仅是结果会更好。 –

+0

完美!谢谢! – weskpga

0

如果您需要这只是在查询你可以写这样的事情试试这个代码

select a.ItemID,a.Quantity,a.Price,x.Total form table_name a 
left outer join 
(select sum(Quantity) Total, ItemID from table_name group by ItemID)x 
on x.ItemID = a.ItemID 
0

;WITH CTE_Total AS 
(
    SELECT ItemID, SUM(Quantity) as TotalQ 
    FROM YourTable 
    GROUP BY ItemID 
) 
SELECT t.*, c.TotalQ 
FROM YourTable t 
LEFT JOIN CTE_Total c on t.ItemID = c.ItemID 

SQLFiddle DEMO

但是,如果你想在你的表格自动计算列,首先你需要创建一个函数,它的计算:

CREATE FUNCTION dbo.fn_YourTableTotalQ (@ItemID VARCHAR(3)) 
RETURNS Int 
AS 
BEGIN 
    DECLARE @toRet INT 

    SELECT @toRet = COALESCE(SUM(Quantity),0) 
    FROM YourTable WHERE ItemID = @ItemID 

    RETURN @toRet 
END 

...然后添加新列计算使用此功能:

ALTER TABLE YourTable 
ADD TotalQ AS dbo.fn_YourTableTotalQ(ItemID) 

SQLFiddle DEMO