首页 > 解决方案 > MySql 选择总和并计算每列的百分比

问题描述

在选择之后,我得到按 id 分组的总和,我还需要计算每个总和相对于总数的百分比

MySQL 表如下所示

|status|a|b1|b2|c1|c2|
-------------------------
|IMMA  |1|0 |0 |1 |0 |
|IMMA  |0|1 |1 |0 |1 |
|IMMA  |1|1 |1 |0 |1 |
|IMMA  |1|1 |1 |0 |1 |

我现在使用的查询是

SELECT imma_dbase_full.`status`,
SUM(imma_dbase_full.`a`) as `A`,
SUM(imma_dbase_full.`b1`) + SUM(imma_dbase_full.`b2`) as `B`,
SUM(imma_dbase_full.`c1`) + SUM(imma_dbase_full.`c2`) as `C`
FROM imma_dbase_full
WHERE imma_dbase_full.`status` = 'IMMA'
GROUP BY imma_dbase_full.`status`;

输出是

|status|A|B|C|
----------------
|IMMA  |3|6|3|

但是我需要创建如下输出:

|status|A  |B  |C  |
-------------------- 
|IMMA  |3  |6  |3  |
|%     |25%|50%|25%|

MySQL有可能吗?

标签: mysql

解决方案


可以在单独的 SELECT 然后 UNION 中进行计算,使其显示为一个,但这不是一个很好的解决方案。为了优化,最好在应用程序级别计算百分比。

SELECT `status`,
SUM(`a`) as `A`,
SUM(`b1`+`b2`) as `B`,
SUM(`c1`+`c2`) as `C`
FROM imma_dbase_full
WHERE `status` = 'IMMA'
UNION
SELECT '%',
SUM(`a`) / SUM(`a`+`b1`+`b2`+`c1`+`c2`) * 100,
SUM(`b1`+`b2`) / SUM(`a`+`b1`+`b2`+`c1`+`c2`) * 100,
SUM(`c1`+`c2`) / SUM(`a`+`b1`+`b2`+`c1`+`c2`) * 100
FROM imma_dbase_full
WHERE `status` = 'IMMA'

Ps.:在您的原始查询中GROUP BY没有意义,因为您正在过滤Status=IMMA所以只有一个状态,不需要分组。


推荐阅读