Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算mySQL中已存在SUM的百分比_Mysql_Sql_Subquery_Correlated Subquery - Fatal编程技术网

计算mySQL中已存在SUM的百分比

计算mySQL中已存在SUM的百分比,mysql,sql,subquery,correlated-subquery,Mysql,Sql,Subquery,Correlated Subquery,我有一张这样的桌子(我无法控制): 如图所示,您可以看到它已经在单独的一行中包含了total calculate 我必须计算百分比,应该是这样的: 问题是如何在子查询中传递Total,如 从Topic='Total'的位置选择标记 ,这样我就只有一行了 谢谢你可以按照 SELECT m1.*, ROUND(m1.marks / m2.marks * 100, 2) percentage FROM marks m1 join marks m2 ON m1.name = m2.nam

我有一张这样的桌子(我无法控制):

如图所示,您可以看到它已经在单独的一行中包含了total calculate 我必须计算百分比,应该是这样的:

问题是如何在子查询中传递Total,如
从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 | ... |姓名|主题|分数|百分比| |------|---------|-------|------------| |乔|化学| 43 | 26.38| |乔|数学| 75 | 46.01| |乔|物理学| 45 | 27.61| |乔|总计| 163 | 100| ...

在子查询中,选择具有相同名称的行和主题
'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';
名称
必须是唯一的,并且每个名称只能有一行包含
“总计”
。否则,子查询将抛出一个关于返回多行的错误。对于join,没有这样的错误,只有无意义/不明确的结果

您还可以考虑总数为
0
的情况,因为这将触发零除错误


桌子的设计很糟糕。表格代表关系,而不是电子表格。总数为的行在其中没有任何意义。查找关系规范化。

总计不应在表中。如果你不能修改它,我会忽略这个值,计算总数,然后计算百分比

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

您最好将非总记录与名称上的总记录合并。这很有帮助!