计算 mySQL 中的百分比,其中 SUM 已存在于 table 中

Calculate percentage in mySQL where SUM is already present in the table

我有一个像这样的table(我无法控制):

因为,你可以看到这已经在单独的一行中计算了总计 我必须计算应该看起来像这样的百分比:

问题是如何在子查询中传递总计,例如 SELECT Marks from <TABLE> WHERE Topic = 'Total';

,这样我只得到一行?

谢谢

你可以按照

的方式做一些事情
SELECT m1.*, ROUND(m1.marks / m2.marks * 100, 2) percentage
  FROM marks m1 join marks m2
    ON m1.name = m2.name AND m2.topic = 'Total'
 ORDER BY name, topic

输出:

| Name |   Topic | Marks | percentage |
|------|---------|-------|------------|
|  Joe |    Chem |    43 |      26.38 |
|  Joe |   Maths |    75 |      46.01 |
|  Joe | Physics |    45 |      27.61 |
|  Joe |   Total |   163 |        100 |
...

SQLFiddle

在子查询中 select 具有相同名称和主题的行 'Total'

SELECT t1.name,
       t1.topic,
       t1.marks,
       t1.marks
       / (SELECT t2.marks
                 FROM elbat t2
                 WHERE t2.name = t1.name
                       AND t2.topic = 'Total')
       * 100 percentage
       FROM elbat t1;

另一种选择是使用连接。

SELECT t1.name,
       t1.topic,
       t1.marks,
       t1.marks
       / t2.marks
       * 100 percentage
       FROM elbat t1
            LEFT JOIN elbat t2
                      ON t2.name = t1.name
                         AND t2.topic = 'Total';

name 必须是唯一的,并且每个名称只能有一行 'Total'。否则子查询将抛出返回多行的错误。通过连接,没有这样的错误,但是 nonsense/ambiguous 结果。

您可能还会考虑当总数为 0 时的情况,因为这会触发被零除的错误。

table 设计唉,太糟糕了。表格代表关系,而不是电子表格。带有总数的行在那里没有任何业务。查找关系规范化。

总数不应在table中。鉴于你不能修改它,我会忽略那个值并计算总数然后计算百分比。

SELECT
    m.Name,
    Topic,
    Marks,
    Marks / t.Total * 100 AS Percentage
FROM
    marks AS m
JOIN (    
    SELECT
        Name,
        SUM(Marks) AS Total
    FROM
        marks
    WHERE 
        Topic != 'Total'
    GROUP BY
        Name) AS t ON t.Name = m.Name