我有一张学生记分卡表.这是桌子,
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)
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)
上面的查询将生成另一个查询,为您进行选择.
样本结果:
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)
小智 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)