【问题标题】:Calculating Running totals across rows and grouping by ID跨行计算运行总计并按 ID 分组
【发布时间】:2019-10-27 15:18:07
【问题描述】:

我想计算跨表的运行总行数,但是对于新的 ID,总和必须重新开始

https://imgur.com/a/YgQmYQA

我的代码:

set @csum := 0;
select ID, name, marks, (@rt := @rt + marks) as Running_total from students order by ID;

输出返回总数,但不会中断或重新开始新 ID

【问题讨论】:

  • 将表格定义、示例数据、预期输出作为文本添加到您的问题中,而不是作为图像

标签: mysql sql


【解决方案1】:

兄弟试试这个...它在 MSSQL 上测试过..

select ID, name, marks, 
    marks + isnull(SUM(marks) OVER (  PARTITION BY ID   ORDER BY  ID  ROWS BETWEEN UNBOUNDED PRECEDING  AND  1  PRECEDING) ,0) as Running_total
from students 

【讨论】:

    【解决方案2】:

    您需要按 ID 对运行总计进行分区。运行总计总是需要某个列的顺序,通过您要计算运行总计的顺序。假设每个ID下的总和是基于ORDER的标记,

    方法 1:如果您的 DBMS 支持分析函数,它可以写在一个简单的查询中

    SELECT     ID
               ,name
               ,marks
               ,Running_total = SUM(marks) OVER (PARTITION BY ID ORDER BY marks ASC)
    FROM       students
    

    方法 2:如果您的数据库版本/DBMS 本身不支持分析功能,您可以使用 OUTER APPLY

    SELECT     S.ID
               ,S.name
               ,S.marks
               ,Running_total = OA.runningtotalmarks 
    FROM       students S
               OUTER APPLY (
                               SELECT   runningtotalmarks = SUM(SI.marks)
                               FROM     students SI
                               WHERE    SI.ID = S.ID
                               AND      SI.marks <= S.marks
                           ) OA;
    

    注意:- 以上查询已通过 MS SQL Server 测试。

    【讨论】:

    • @dan71995 能否请您支持它的答案?
    • 您好,San,我确实投了赞成票,但堆栈溢出返回此消息:“感谢您的反馈!声望低于 15 人的投票将被记录,但不要更改公开显示的帖子分数。”
    • 我明白了。没问题:)
    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 2016-08-31
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2017-10-04
    • 2012-07-03
    • 2023-03-23
    相关资源
    最近更新 更多