首页 > 解决方案 > SQL - 总和每行中的前 N ​​个值

问题描述

这是我的 SQL 表。

+-------+------+------+------+------+
| name  | q1   | q2   | q3   | q4   |
+-------+------+------+------+------+
| Alex  |    5 |    4 |   10 |    7 |
| Brown |    7 |    6 |    4 |    1 |
| Chris |   10 |   10 |    9 |   10 |
| Dave  |    8 |    4 |    6 |    0 |
+-------+------+------+------+------+

我想在上面的 SQL 查询中总结每个用户的前 2 个分数。

例如,Alex 的前 2 个分数是107,所以总和是10 + 7 = 17

我尝试了以下查询:

SELECT NewStudents.name, SUM(q1+q2+q3+q4) FROM NewStudents 
GROUP BY NewStudents.name;

将除此q1, q2, q3, q4查询之外的所有内容求和,而不是q1对中的q4前 2 个分数求和。q1q4

如何在 mySQL 中构造我想要执行的语句?

标签: mysqlsqlsumtop-n

解决方案


正如评论中@Shadow 中所述..您的数据库需要再次重组..因为这不是数据库工作..您可以像这样重组和进行设计..

+-------+----+--------+
| name  |  q | point  |
+-------+----+--------+
| Alex  |  1 |      5 |
| Alex  |  2 |      4 |
| Alex  |  3 |     10 |
| Alex  |  4 |      7 |
| Brown |  1 |      7 |
| Brown |  2 |      6 |
| Brown |  3 |      4 |
| Brown |  4 |      1 |
| Chris |  1 |     10 |
| Chris |  2 |     10 |
| Chris |  3 |      9 |
| Chris |  4 |     10 |
| Dave  |  1 |      8 |
| Dave  |  2 |      4 |
| Dave  |  3 |      6 |
| Dave  |  4 |      0 |
+-------+----+--------+

对于查询,您可以这样做:

select
     name, sum(point)
from(
     select 
          name, q, point,
          ROW_NUMBER() OVER (PARTITION BY name ORDER BY point DESC) as ranked
     from newstudents) rankedSD
where
     ranked in (1,2)
group by 
     name

您可以在此处查看演示:

演示<>小提琴

编辑:您可以使用Window Function. 您可以阅读Row_Number() 函数


推荐阅读