如何在SQL中添加某些行的计算列

时间:2016-08-07 21:34:32

标签: sql-server tsql

我想添加一个计算列(持久),它是同一组类别的总行数,例如下面的销售订单。你会如何在SQL Server中执行此操作?

  SalesOrder    Amount    Total(calculated)
    100            10      25
    100            15      25
    101            20      45
    101            25      45
    102            30      65
    102            35      65

2 个答案:

答案 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