我不确定解决这个问题的最佳方法是什么,所以我想我会把它扔给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的价格的函数以及需要在聚合函数中使用的一些其他东西(所有非常基本的数学运算)。
答案 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)
这应该比使用子选择更有效。
请确保您拥有适当的索引以获得最佳效果。