【问题标题】:How to get running sum of a column in sql server如何在sql server中获取列的运行总和
【发布时间】:2013-02-03 21:16:47
【问题描述】:

您好,我在 Bills 表中有一个名为 Qty 的列 我想要一列显示数量列的运行总和,如下所示:

Qty   Run_Sum
1      1
2      3
3      6
4      10
5      15

建议我一些适当的方法来运行一些谢谢

【问题讨论】:

  • 运行总和如何? 1 1 2 3 5 8 13 21 34 .....[斐波那契数列]将是运行总和的一个例子。
  • 你在用什么RDBMSSQL Server? MySQL? Oracle? DB2?等等。
  • 我使用的是 sql server 2008
  • @user1448783 您希望选择查询中的数据用于报告目的还是希望在表格中添加一列?
  • @user1448783 你试试我的回答了吗?

标签: sql sql-server sql-server-2008 select


【解决方案1】:

如果您的 RDBMS 支持窗口功能,

罢工>

SQL Server 2012

SELECT  Qty,
        SUM(Qty) OVER (ORDER BY Qty) AS CumulativeTOTAL
FROM    tableName

SQL Server 2008

SELECT a.Qty, (SELECT SUM(b.Qty)
               FROM   TableName b
               WHERE  b.Qty <= a.Qty)
FROM   TableName a
ORDER  BY a.Qty;

【讨论】:

  • 我认为子查询会很慢
【解决方案2】:

SQLFiddle demo

SELECT Qty,
SUM(Qty) OVER (ORDER BY Qty) Run_Sum
FROM t ORDER BY Qty

对于 2012 年之前的 SQLServer:

select Qty,
(select sum(Qty) from t where Qty<=t1.Qty)
from t t1 order by Qty

SQLFiddle demo

或者你也可以不使用子查询:

select t1.Qty, sum(t2.Qty)
from t t1 
join t t2 on (t1.Qty>=t2.Qty)
group by t1.Qty
order by t1.Qty

SQLFiddle demo

【讨论】:

  • 为以前的 SQLServer 版本添加了查询
  • @a_horse_with_no_name 是的,但我指的只是 sql server :)的版本
  • 只有quantity 是唯一的,您的答案才有效。如果有重复的quantities,那将如何工作?
  • @Valex 我在解决方案 #1 中没有发现任何独特之处,每个人都提到它不适用于 SQL Server 2012 的早期版本;这也适用于 SQL Server 2008 R2+ (sqlfiddle.com/#!3/bafd7/6)。我错过了什么吗?
  • @AnujTripathi OVER 子句从 SQL Server 2008 R2 开始实施
【解决方案3】:

这是一个使用 Oracle/分析函数的示例:

select id, qty, sum(qty) over(order by id asc) run_sum
from test;

http://www.sqlfiddle.com/#!4/3d149/1

【讨论】:

  • 亲爱的我正在使用sql server,请在sql server中提供一些示例代码
  • 是的,感谢您指出这一点。这是更新后的查询 (sqlfiddle.com/#!3/6ac1f/5):select id, qty, (select sum(qty) from test where id &lt;= t.id) run_sum from test t;
【解决方案4】:

检查一下

DECLARE @TEMP table
(
    ID int IDENTITY(1,1),
    QUANTITY int
)

INSERT INTO @TEMP
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 8 UNION ALL
SELECT 7 UNION ALL
SELECT 5 UNION ALL
SELECT 1

SELECT t.QUANTITY AS Qty, SUM(t1.QUANTITY) AS Run_Sum
FROM @TEMP t
INNER JOIN @TEMP t1
ON t1.ID <= t.ID
GROUP BY t.ID, t.QUANTITY
ORDER BY t.ID

【讨论】:

    【解决方案5】:
    ;with cte as (
      select top 1 Qty, Qty as RunningSum
      from Bills
      order by Qty
    
      union all
    
      select t.Qty, cte.RunningSum + t.Qty
      from cte
      inner join Bills t on cte.Qty + 1 = t.Qty
    )
    select * from cte
    

    【讨论】:

      【解决方案6】:

      @mahmud: 看看这会带来什么

      DECLARE @Bills table
      (
          QUANTITY int
      )
      
      INSERT INTO @Bills
      SELECT 2 UNION ALL
      SELECT 6 UNION ALL
      SELECT 7 UNION ALL
      SELECT 1 UNION ALL
      SELECT 3 UNION ALL
      SELECT -5 UNION ALL
      SELECT 5 UNION ALL
      select 1
      
      ;with cte as (
        select top 1 QUANTITY, QUANTITY as RunningSum
        from @Bills
        order by QUANTITY
      
        union all
      
        select t.QUANTITY, cte.RunningSum + t.QUANTITY
        from cte
        inner join @Bills t on cte.QUANTITY + 1 = t.QUANTITY
      )
      select * from cte
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-12
        • 2015-05-07
        • 2015-02-21
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 2021-12-20
        相关资源
        最近更新 更多