许多聚合函数在select查询中

时间:2013-11-27 14:54:34

标签: sql

我不确定解决这个问题的最佳方法是什么,所以我想我会把它扔给SO。

我正在为一个应用程序编写一个视图,该视图将根据我们数据库中的几个表显示一些网格数据。我知道我可以在查询的选择部分使用聚合函数来做这个,但我想知道是否有更有效的方法(可能有子选择)或者这是否足够好。

示例:

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的价格的函数以及需要在聚合函数中使用的一些其他东西(所有非常基本的数学运算)。

2 个答案:

答案 0 :(得分: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)作为输入参数类型的函数一起使用,则这是性能杀手。

答案 1 :(得分:0)

这应该比使用子选择更有效。

请确保您拥有适当的索引以获得最佳效果。