2013-05-16 96 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