SQL分组后计算占比:如何为分组统计结果添加占比列?
为分组统计结果添加占比列
现有SQL语句可实现按账户分组统计计数,需要新增一列展示该计数在总数中的占比:
现有查询语句
SELECT f.name AS Acc., count(h.fair) AS Count FROM holes h JOIN fair f ON f.fair_id = h.fair GROUP BY f.name
当前输出结果
| Acc. | Count |
|---|---|
| A | 5 |
| B | 6 |
| C | 4 |
| D | 5 |
期望输出结果
| Acc. | Count | Percentage |
|---|---|---|
| A | 5 | 25% |
| B | 6 | 30% |
| C | 4 | 20% |
| D | 5 | 25% |
修改后的SQL语句
使用窗口函数SUM() OVER()计算全局总数,再结合分组计数计算占比:
SELECT f.name AS `Acc.`, COUNT(h.fair) AS `Count`, CONCAT(ROUND((COUNT(h.fair) / SUM(COUNT(h.fair)) OVER()) * 100, 0), '%') AS `Percentage` FROM holes h JOIN fair f ON f.fair_id = h.fair GROUP BY f.name
说明
SUM(COUNT(h.fair)) OVER():通过窗口函数获取所有分组的计数总和(即全局总数),OVER()不带参数表示作用于整个结果集。(COUNT(h.fair) / 全局总数) * 100:计算当前分组计数占总数的百分比。ROUND(..., 0):将百分比结果取整(如果需要保留小数可调整第二个参数,比如保留1位小数用ROUND(...,1))。CONCAT(..., '%'):将数值拼接成带百分号的字符串格式。
该语句适用于MySQL 8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库。
内容的提问来源于stack exchange,提问作者J Bree
相关产品推荐
相关产品推荐

