计算 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 |
...
在子查询中 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
我有一个像这样的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 | ...
在子查询中 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