【问题标题】:Adding first two rows result as a second row then addition of first three rows result as a third row and so on添加前两行结果为第二行,然后添加前三行结果为第三行,依此类推
【发布时间】:2017-04-10 13:37:37
【问题描述】:

我在 sql serevr 中有一个表,它有一列并存储整数值。

例如:列数据


   100

   150

   20

   25

   300

现在通过使用这些数据,我想要如下所示的结果。

columndata 新列


   100        100

   150        250

   20         270

   25         295

   300        595

所以在输出中新列由逻辑相加,即第一行数据作为第一行,然后前两行相加结果出现在第二行,然后前三行相加结果出现在第三行,依此类推...

任何人都可以向我提供查询如何获得我的结果。

提前致谢,

帕尼库马尔。

【问题讨论】:

  • mysql <> sqlserver,请正确标记。
  • 这称为“运行总计”。我相信您可以通过谷歌搜索该短语来了解如何操作。

标签: sql sql-server


【解决方案1】:

假设您有一列可以对数据进行排序,那么您可以通过使用窗口聚合函数(适用于 SQL Server 2012+)或自联接(适用于任何版本)来计算运行总计.如果您没有任何要订购的列,则根本无法以确定的方式完成。

-- sample table:
create table t (id int identity(1,1), ColumnData int)
insert t values (100),(150),(20),(25),(300)

-- query 1 using windowed aggregate
select ColumnData, sum(ColumnData) over (order by id) as  NewColumn
from t order by id

-- query 2 using self-join    
select t1.ColumnData, sum(t2.ColumnData) as  NewColumn
from t t1
join t t2 on t2.id <= t1.id
group by t1.id, t1.ColumnData
order by t1.id

Sample SQL Fiddle

【讨论】:

  • 我从未见过没有rangerows 表达式的sum(&lt;field&gt;) over(order by &lt;otherfield&gt;),例如sum(&lt;field&gt;) over(order by &lt;otherfield&gt; rows unbounded preceding)。有区别吗?他们似乎有不同的执行计划。
  • @BaconBits 窗口框架是可选的。文档说:“如果未指定 ROWS/RANGE 但指定了 ORDER BY,则将 RANGE UNBOUNDED PRECEDING AND CURRENT ROW 用作窗口框架的默认值。”
  • 哦,我错过了。谢谢!
【解决方案2】:

您需要使用 PL SQL 来执行此操作。 更改表格以有一个新字段 id 进行排序和 value2 具有最终结果。

DECLARE
 l_last_sum       INTEGER := 0;

 CURSOR test_cur
 IS
      SELECT id,value
        FROM test
    ORDER BY id ASC;

 l_test   test_cur%ROWTYPE;
BEGIN
 OPEN test_cur;

 LOOP
    FETCH test_cur INTO l_test;
    EXIT WHEN test_cur%NOTFOUND;

    l_last_sum:=l_last_sum+l_test.value;
    update test set value2=l_last_sum where id=l_test.id;

 END LOOP;

 CLOSE test_cur;
END; 



  SQL> select * from test;                                                                                

    ID      VALUE     VALUE2                                                                        
 ---------- ---------- ----------                                                                        
     1        100        100                                                                        
     2         25        125                                                                        
     3         40        165 

【讨论】:

  • 问题是关于不支持 PL/SQL 的 MS SQL Server。
  • 感谢您的解决方案。
【解决方案3】:

与萨尔作为( select a.empid,salry,row_number() over(order by empid) rn from empmaster a) 选择 a.empid,a.salry,b.salry,a.salry+b.salry 来自萨尔 左外连接sal b on a.rn = b.rn-1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多