Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL中添加特定行的计算列_Sql Server_Tsql - Fatal编程技术网

Sql server 如何在SQL中添加特定行的计算列

Sql server 如何在SQL中添加特定行的计算列,sql-server,tsql,Sql Server,Tsql,我想添加一个计算列(持久化),它是同一组类别(如下面的销售订单)的总行数。您将如何在SQL Server中执行此操作 SalesOrder Amount Total(calculated) 100 10 25 100 15 25 101 20 45 101 25 45 102 30

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

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

用于存储自动维护的预计算聚合的最佳机制是索引视图,这不可能通过持久化计算列实现(您可以在计算列中使用标量UDF来计算结果,但这无法持久化,而且此类计算列通常会对性能造成不利影响,因为它们会强制进行RBAR计算并阻止并行性)

然后,将预先计算聚合并将其存储在视图中。您的查询将需要在视图中加入。您可能需要使用
NOEXPAND
提示,以确保实际使用了预先计算的聚合,并且在运行时不会重新计算它们。

For 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

太好了,谢谢!stackexchange的速度太快了。@el_kraken,如果这个答案对你有用,请接受这个答案。如果他们决定不进行预计算,这实际上在2005+年有效。
saleOrder | amount | total
==========================
    100   |   10   |  25
    100   |   15   |  25
    101   |   20   |  45
    101   |   25   |  45
    102   |   30   |  65
    102   |   35   |  65