关于sql:MySQL Sum()多列

MySQL Sum() multiple columns

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

1
2
3
4
5
6
subject  | mark1 | mark2 | mark3 |......|markn
stud1    | 99    | 87    | 92    |      | 46
stud2    |....................................
  .
  .
studn    |....................................|

现在,我需要为每个分数总计的学生求和。我通过使用sum(mark1+mark2+...+markn) group by stud获得了它。我想知道如何在不添加每个列名称的情况下进行求和,以防出现mark26的情况。所以没有人知道如何修复它。预先感谢。


1
2
3
SELECT student, (SUM(mark1)+SUM(mark2)+SUM(mark3)....+SUM(markn)) AS Total
 FROM your_table
 GROUP BY student


执行此操作的另一种方法是生成选择查询。玩这个小提琴。

1
2
3
4
5
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
    SELECT mark1+mark2+mark3 FROM scorecard

    您将不再需要手动添加所有列。


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

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

    1
    SUM(IFNULL(`mark1`, 0) + IFNULL(`mark2`, 0) + IFNULL(`mark3`, 0)) AS `total_marks`

    如果第一个为NULL,

    IFNULL将返回第二个参数。
    可以使用COALESCE,但我更喜欢仅在需要时使用它。
    请参见mysql中ifnull和coalesce有什么区别?

    对整个计算求和要比对每一列分别求和要好。

    1
    2
    3
    SELECT `student`, SUM(IFNULL(`mark1`, 0) + IFNULL(`mark2`, 0) + IFNULL(`mark3`, 0)) AS `total_marks`
    FROM student_scorecard
    GROUP BY `student`

    SELECT学生,SUM(mark1 mark2 mark3 .... markn)AS总计from your_table


    简而言之,鉴于您拥有的设计,没有很好的方法来做到这一点。这是关于此主题的一个相关问题:单行的总和值?

    如果规范化了架构并创建了一个单独的表" Marks ",该表具有subject_id和mark列,则可以利用关系模型所期望的SUM函数。

    那么您的查询将是

    1
    2
    3
    4
    SELECT subject, SUM(mark) total
    FROM Subjects s
      INNER JOIN Marks m ON m.subject_id = s.id
    GROUP BY s.id


    // mysql多行总和
    嗨,这是进行列总和的简单方法

    1
    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'

    您可以更改数据库结构,以使所有主题行都成为列变量(如电子表格)。这使得这种分析更加容易