MySQL Sum()多列

时间:2014-03-13 04:51:46

标签: mysql sql

我有一张学生记分卡表。 这是表格,

subject  | mark1 | mark2 | mark3 |......|markn
stud1    | 99    | 87    | 92    |      | 46
stud2    |....................................
  .
  .
studn    |....................................|

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

7 个答案:

答案 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%';

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

  1. 运行以上查询。
  2. 获取结果并运行生成的查询。
  3. 示例结果:

    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`