获取一列的滚动 SUM 并将结果带入 SQL

Posted

技术标签:

【中文标题】获取一列的滚动 SUM 并将结果带入 SQL【英文标题】:Get the rolling SUM of one column and bring the result in SQL 【发布时间】:2019-02-28 23:07:09 【问题描述】:

我有一个包含 3 列的表格:

ID   date           Amount
---------------------------
0    2019-01-25        500
3    2019-02-25       -200
4    2019-02-28        700
5    2019-02-28       -300

我想要一个在附加列中返回 Amount 列的滚动总计的查询:

ID   date           Amount     total amount
--------------------------------------------
0    2019-01-25        500              500
3    2019-02-25       -200              300
4    2019-02-28        700             1000
5    2019-02-28       -300              700

这是我的查询:

   SELECT 
       ID,
       TrDate,
       Amount,
       SUM(CONVERT(FLOAT, [Amount])) AS 'total amount'                     
   FROM 
       [Transactions]

【问题讨论】:

我更改了您的标签。如果这实际上与 C# 有关,请随时将标签放回原处,但也请编辑问题以解释其相关性。 Adding a running total column in SQL Server的可能重复 这里没有问题。究竟是什么问题? 为什么你需要在你的Amount 列上做一个CONVERT(FLOAT 吗?如果这是一个数值,那么列应该是一个数值数据类型!另外:我强烈建议使用 DECIMAL(p,s) 而不是 FLOAT,尤其是在处理金钱时 - 因为 FLOAT 本质上是不准确的并且容易出现舍入错误 【参考方案1】:

使用窗口函数SUM(...) OVER(...)

SELECT *, SUM(Amount) OVER(ORDER BY id) total_amount FROM mytable;

Demo on DB Fiddle

<pre>
ID | date                | Amount | total_amount
-: | :------------------ | -----: | -----------:
 0 | 25/01/2019 00:00:00 |    500 |          500
 3 | 25/02/2019 00:00:00 |   -200 |          300
 4 | 28/02/2019 00:00:00 |    700 |         1000
 5 | 28/02/2019 00:00:00 |   -300 |          700
</pre>

注意:如果您的 SQLServer 版本不支持窗口函数,那么您可以自加入表并使用聚合:

SELECT t.id, t.date, t.amount, SUM(t1.amount) total_amount
FROM mytable t
INNER JOIN mytable t1 ON t1.id <= t.id
GROUP BY t.id, t.date, t.amount

【讨论】:

它不起作用我在每条记录中都得到了 700 的结果 @Master :它在我在回答中提供的数据库小提琴中工作。您是否正确复制了我的查询? 我正在使用 sqlserver 2008R2,当我读到 order by 正在 2012 年及以上工作时,这就是为什么它不适用于我 @Master : 我用没有窗口函数的解决方案更新了我的答案 这似乎适用于我的查询,但我无法提供任何帮助?

以上是关于获取一列的滚动 SUM 并将结果带入 SQL的主要内容,如果未能解决你的问题,请参考以下文章

如何将垂直滚动条添加到始终固定第一列的表中

可固定列的可滚动表,固定列大小相等

移动端固定头部和固定左边第一列的实现方案(Vue中实现demo)

滚动百分位数 - 熊猫

Access VBA中一列的总和

SQL - 为给定列中的值获取另一列的值