获取一列的滚动 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的主要内容,如果未能解决你的问题,请参考以下文章