MySQL Sum()多列

rk3*_*423 55 mysql sql

我有一张学生记分卡表.这是桌子,

subject  | mark1 | mark2 | mark3 |......|markn
stud1    | 99    | 87    | 92    |      | 46
stud2    |....................................
  .
  .
studn    |....................................|
Run Code Online (Sandbox Code Playgroud)

现在,我需要为每个学生总分加上它.我通过使用得到它sum(mark1+mark2+...+markn) group by stud.我想知道如何在不添加每个列名的情况下对其进行求和,如果达到标记26,它将是巨大的.所以任何人都知道如何解决它.提前致谢.

Mau*_*tel 81

SELECT student, (SUM(mark1)+SUM(mark2)+SUM(mark3)....+SUM(markn)) AS Total
 FROM your_table
 GROUP BY student
Run Code Online (Sandbox Code Playgroud)

  • "我想知道如何在不添加每个列名称的情况下对其进行求和." (3认同)
  • @Maulik patel,而不是(sum(mark1)+ sum(mark2).... + sum(markn)),最好遵循sum(mark1 + mark2 + ... + markn). (3认同)

maj*_*rif 25

另一种方法是生成选择查询.玩这个小提琴.

SELECT CONCAT('SELECT ', group_concat(`COLUMN_NAME` SEPARATOR '+'), ' FROM scorecard') 
FROM  `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA` = (select database()) 
AND   `TABLE_NAME`   = 'scorecard'
AND   `COLUMN_NAME` LIKE 'mark%';
Run Code Online (Sandbox Code Playgroud)

上面的查询将生成另一个查询,为您进行选择.

  1. 运行以上查询.
  2. 获取结果并运行生成的查询.

样本结果:

SELECT mark1+mark2+mark3 FROM scorecard
Run Code Online (Sandbox Code Playgroud)

您不必再手动添加所有列.


Tar*_*nes 14

如果您的任何markn列是“AllowNull”,那么您需要做一些额外的工作以确保返回正确的结果,这是因为 1 个 NULL 值将导致 NULL 总数。

这就是我认为的正确答案。

SUM(IFNULL(`mark1`, 0) + IFNULL(`mark2`, 0) + IFNULL(`mark3`, 0)) AS `total_marks` 
Run Code Online (Sandbox Code Playgroud)

如果第一个参数为 NULL,则IFNULL将返回第二个参数。 可以使用COALESCE,但我更喜欢仅在需要时才使用它。请参阅mysql中的ifnull和coalesce有什么区别?

SUM -整个计算比 SUM 单独每个列更整洁。

SELECT `student`, SUM(IFNULL(`mark1`, 0) + IFNULL(`mark2`, 0) + IFNULL(`mark3`, 0)) AS `total_marks` 
FROM student_scorecard
GROUP BY `student`
Run Code Online (Sandbox Code Playgroud)

我想知道如何在不添加每个列名的情况下对其进行求和,以防万一marks26

要在 sql 中动态生成和执行此语句,您需要使用 INFORMATION_SCHEMA.COLUMNS 表创建一个查询字符串,然后使用保存在变量中的准备好的语句执行它。

SELECT CONCAT('SELECT `student`, SUM(IFNULL(`', group_concat(`COLUMN_NAME` SEPARATOR '`, 0) + IFNULL(`'), '`, 0) AS `total_marks` FROM `student_scorecard` GROUP BY `student`') 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA` = (select DATABASE()) 
AND `TABLE_NAME`   = 'student_scorecard'
AND `COLUMN_NAME` LIKE 'mark%'
# adapted from /sf/answers/1565883721/


# insert statement sql into a variable
INTO @statement_var;

#prepare the statement string
PREPARE stmt_name FROM @statement_var;

#execute the prepared statement/query
EXECUTE stmt_name;

# release statement
DEALLOCATE PREPARE stmt_name;
Run Code Online (Sandbox Code Playgroud)


Har*_*rat 7

SELECT student, SUM(mark1+mark2+mark3+....+markn) AS Total from your_table


小智 5

简短的回答是,鉴于您拥有的设计,没有什么好方法可以做到这一点。这是关于该主题的相关问题:Sum values of a single row?

如果您规范了架构并创建了一个名为“Marks”的单独表,该表具有一个 subject_id 和一个标记列,这将允许您按照关系模型的预期利用 SUM 函数。

那么你的查询将是

SELECT subject, SUM(mark) total 
FROM Subjects s 
  INNER JOIN Marks m ON m.subject_id = s.id
GROUP BY s.id
Run Code Online (Sandbox Code Playgroud)