如何用MySQL统计各问题的选项选中占比(百分比形式)
MySQL统计问题各选项选中占比的SQL实现
表结构与示例数据
假设你的表名为question_selections,表结构及数据如下:
| Question_Id | Selected_Option |
|---|---|
| 65 | Option A |
| 101 | Option B |
| 65 | Option C |
实现思路
要计算每个问题下各选项的选中占比,核心是先获取每个问题的总选择次数,再计算单个选项在该问题下的选择次数,最后用「选项次数/总次数」得到占比并格式化为百分比。
SQL语句(MySQL 8.0+ 推荐)
使用窗口函数OVER (PARTITION BY Question_Id)可以高效获取每个问题的总选择数,无需额外子查询关联:
SELECT Question_Id, Selected_Option, CONCAT( ROUND( (COUNT(*) * 100) / COUNT(*) OVER (PARTITION BY Question_Id), 0 ), '%' ) AS Selection_Percentage FROM question_selections GROUP BY Question_Id, Selected_Option ORDER BY Question_Id;
语句说明
GROUP BY Question_Id, Selected_Option:按问题和选项分组,统计每个选项的选中次数COUNT(*) OVER (PARTITION BY Question_Id):窗口函数,计算当前问题的总选择次数ROUND(..., 0):将占比保留整数位,若需要小数可调整第二个参数(比如保留1位小数写ROUND(...,1))CONCAT(..., '%'):将数值转为带百分号的字符串格式
执行结果
| Question_Id | Selected_Option | Selection_Percentage |
|---|---|---|
| 65 | Option A | 50% |
| 65 | Option C | 50% |
| 101 | Option B | 100% |
兼容MySQL 5.x版本的写法
如果你的MySQL版本不支持窗口函数,可以用子查询先统计每个问题的总次数,再关联计算:
SELECT qs.Question_Id, qs.Selected_Option, CONCAT( ROUND( (COUNT(qs.Selected_Option) * 100) / qt.Total_Count, 0 ), '%' ) AS Selection_Percentage FROM question_selections qs JOIN ( SELECT Question_Id, COUNT(*) AS Total_Count FROM question_selections GROUP BY Question_Id ) qt ON qs.Question_Id = qt.Question_Id GROUP BY qs.Question_Id, qs.Selected_Option ORDER BY qs.Question_Id;
内容的提问来源于stack exchange,提问作者Adeel Zaman
相关产品推荐
相关产品推荐

