如何返回最后一行的具体总和?

5gfr0r5j  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(298)

假设我们有一行是学生,包含,id,姓名,分数和等级。编写一个查询,返回按年级排序的分数等于100的学生的姓氏。例子

- id | name | marks | grade |
 - 01 | Jeff | 40    | 1 |
 - 02 | Annie| 40    | 3 |
 - 03 | Ramy | 20    | 5 |
 - 04 | Jenny| 20    | 2 |

所以结果应该会回来
安妮
因为安妮是分数总和的最后一行,分数等于100。杰夫是第一个原因,根据年级,他等于1,所以他应该进入第一,第二是珍妮,第三是安妮。杰夫(40)+珍妮(20)+安妮(40)=100

yvgpqqbh

yvgpqqbh1#

保留 marks 一个变量。并将其用作子查询并选择具有 total 是100。但如果没有一行的累计总数为100,则不会得到任何结果。
查询

set @total := 0;
select `id`, `name`, `marks`, `grade` from(
    select `id`, `name`, `marks`, `grade`, (@total := @total + `marks`) as `total`
    from `your_table_name`
    order by `grade`
) as `t`
where `t`.`total` = 100;
rsaldnfx

rsaldnfx2#

您可以对mysql的用户变量进行运行求和。
这个查询应该可以在MySQL5.1及更高版本中使用。
查询

SELECT 
 Table1_alias.name
FROM (

  SELECT 
      Table1.name
   , (@running_marks_sum := @running_marks_sum + Table1.marks) AS running_marks_sum
  FROM 
   Table1
  CROSS JOIN (SELECT @running_marks_sum := 0) AS init_user_param
  ORDER BY 
    Table1.grade ASC  
) AS Table1_alias
WHERE 
 Table1_alias.running_marks_sum = 100

结果

| name  |
| ----- |
| Annie |

db fiddle视图
仅限mysql 8.0+
查询

SELECT 
 Table1_alias.name
FROM (

  SELECT 
     Table1.name
   , SUM(Table1.marks) OVER(ORDER BY Table1.grade) AS running_marks_sum
  FROM 
    Table1

) AS Table1_alias 
WHERE 
  Table1_alias.running_marks_sum = 100;

结果

| name  |
| ----- |
| Annie |

db fiddle视图

0dxa2lsx

0dxa2lsx3#

正如上面提到的数据库结构,下面是获取输出的方法之一
选择名称从(选择*从(选择id、名称、等级、标记,@total:=@total+标记作为总计从(螺柱,(选择@total:=0)t)按等级排序)t,其中total<=100)最终视图按等级排序描述限制1

相关问题