计算mySQL中已存在SUM的百分比
我有一张这样的桌子(我无法控制): 如图所示,您可以看到它已经在单独的一行中包含了total calculate 我必须计算百分比,应该是这样的: 问题是如何在子查询中传递Total,如计算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
从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
您最好将非总记录与名称上的总记录合并。这很有帮助!