我想添加一个计算列(持久),它是同一组类别的总行数,例如下面的销售订单。你会如何在SQL Server中执行此操作?
SalesOrder Amount Total(calculated)
100 10 25
100 15 25
101 20 45
101 25 45
102 30 65
102 35 65
答案 0 :(得分:1)
用于存储自动维护的预先计算的聚合的最佳机制是索引视图,不可能通过持久计算列(您可以在计算列中使用标量UDF来计算结果,但这样不能持久化,这样的计算列通常不利于性能,因为它们会强制进行RBAR评估并阻止并行性。)
CREATE VIEW dbo.AggregatedSales
WITH SCHEMABINDING
AS
SELECT SalesOrder,
SUM(Amount) AS Total
FROM dbo.YourTable
GROUP BY SalesOrder
GO
CREATE UNIQUE CLUSTERED INDEX UIX ON dbo.AggregatedSales(SalesOrder)
然后将预先计算聚合并将其存储在视图中。您的查询需要加入视图。您可能需要使用NOEXPAND
提示以确保实际使用预先计算的聚合,并且不会在运行时重新计算它们。
答案 1 :(得分:0)
对于SQL Server 2012
CREATE TABLE #t (saleOrder int , amount int)
INSERT INTO #t VALUES
(100,10)
,(100,15)
,(101,20)
,(101,25)
,(102,30)
,(102,35)
SELECT *
,SUM(amount) OVER (PARTITION BY saleorder) as [total]
FROM #t
结果:
saleOrder | amount | total
==========================
100 | 10 | 25
100 | 15 | 25
101 | 20 | 45
101 | 25 | 45
102 | 30 | 65
102 | 35 | 65