2013-11-27 65 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

这应该是更有效,然后使用子选择。

只要确保您有合适的索引即可获得最佳性能。