2013-11-27 107 views
0

我不確定什麼是最好的方法來處理這個問題,所以我想我會拋棄它。選擇查詢中的許多聚合函數

我正在爲一個應用程序編寫一個視圖,該應用程序將根據我們的數據庫中的幾張表顯示一些網格數據。我知道我可以在查詢的選擇部分使用聚合函數做到這一點,但我想知道是否有更有效的方法(可能帶有子選擇)或者如果這將足夠好。

實施例:

Table A (LineItems) 
-------- 
OrderID 
Weight1 
Weight2 
UnitPrice 

Table B (Orders) 
-------- 
ID 

查詢例如:

SELECT Orders.ID, SUM(LineItems.Weight1) as W1, SUM(LineItems.Weight2) as W2, ABS(SUM(LineItems.Weight1) - SUM(LineItems.Weight2)), ABS(SUM(LineItems.Weight1) - SUM(LineItems.Weight2)) FROM Orders 
RIGHT OUTER JOIN LineItems ON Orders.ID = OrderLines.OrderID 
WHERE Orders.RecordDeleted <> 'TRUE' 
GROUP BY Orders.ID 

爲了澄清,這僅僅是一個示例。 select查詢將包含函數,用於計算來自lineitems的價格以及需要在聚合函數中使用的一些其他內容(所有非常基本的數學運算)。

回答

1

只要你使用相同的列分組,你應該去。不幸的是,如果你想分組在不同的列上,情況並非如此。計數將被縮小到GROUP BY的整個列表,例如,如果您想要以OrderLines.ID進行分組。

爲了獲得更好的性能,我將使用Orders表中的計算列。

首先,你需要創建一個用戶定義的函數:

CREATE FUNCTION dbo.GetOrderWeight(@Key int) 
RETURNS int 
AS 
BEGIN 
    RETURN (
     SELECT SUM(Weight1) 
     FROM LineItems 
     WHERE OrderID = @Key 
    ) 
END 

然後計算列添加到表:

ALTER TABLE Orders ADD OrderWeight AS dbo.GetOrderWeight(ID) 

與同爲你有其他聚合方法遵循。請注意,如果與具有varchar(max)作爲輸入參數類型的函數一起使用,則這是一個性能殺手。

0

這應該是更有效,然後使用子選擇。

只要確保您有合適的索引即可獲得最佳性能。