我有一张学生记分卡表。 这是表格,
subject | mark1 | mark2 | mark3 |......|markn
stud1 | 99 | 87 | 92 | | 46
stud2 |....................................
.
.
studn |....................................|
现在,我需要为每个学生的总分数求和。我是通过使用sum(mark1+mark2+...+markn) group by stud
得到的。我想知道如何在不添加每个列名的情况下对其进行求和,如果达到标记26,它将是巨大的。所以任何人都知道如何解决它。提前谢谢。
答案 0 :(得分:77)
SELECT student, (SUM(mark1)+SUM(mark2)+SUM(mark3)....+SUM(markn)) AS Total
FROM your_table
GROUP BY student
答案 1 :(得分:24)
另一种方法是生成选择查询。使用此fiddle播放。
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%';
上面的查询将生成另一个查询,为您进行选择。
示例结果:
SELECT mark1+mark2+mark3 FROM scorecard
您不必再手动添加所有列。
答案 2 :(得分:4)
选择学生,SUM(mark1 + mark2 + mark3 + .... + markn)AS总计来自your_table
答案 3 :(得分:3)
简短的回答是,鉴于您的设计,没有很好的方法可以做到这一点。以下是有关该主题的相关问题:Sum values of a single row?
如果您对架构进行了规范化并创建了一个名为“Marks”的单独表,该表具有subject_id和mark列,则可以使用关系模型所预期的SUM函数。
然后你的查询将是
SELECT subject, SUM(mark) total
FROM Subjects s
INNER JOIN Marks m ON m.subject_id = s.id
GROUP BY s.id
答案 4 :(得分:3)
//多行的Mysql总和 嗨这里是做列总和的简单方法
SELECT sum(IF(day_1 = 1,1,0)+IF(day_3 = 1,1,0)++IF(day_4 = 1,1,0)) from attendence WHERE class_period_id='1' and student_id='1'
答案 5 :(得分:0)
您可以更改数据库结构,使所有主题行成为列变量(如电子表格)。这使得这种分析更加容易
答案 6 :(得分:0)
如果您的markn
列中的任何列均为“ AllowNull”,则您需要做一些额外的工作以确保返回正确的结果,这是因为1 NULL值将导致总计NULL。
这就是我认为正确的答案。
SUM(IFNULL(`mark1`, 0) + IFNULL(`mark2`, 0) + IFNULL(`mark3`, 0)) AS `total_marks`
如果第一个为NULL,IFNULL将返回第二个参数。 可以使用COALESCE,但我更喜欢仅在需要时使用它。 参见What is the difference bewteen ifnull and coalesce in mysql?
SUM-整个计算要比SUM-单独对每一列进行整理。
SELECT `student`, SUM(IFNULL(`mark1`, 0) + IFNULL(`mark2`, 0) + IFNULL(`mark3`, 0)) AS `total_marks`
FROM student_scorecard
GROUP BY `student`