SQLite查询:如何计算分组SUM占总SUM的百分比
实现方案
完全可以在现有查询基础上增加逻辑实现占比计算,常用有两种实现方式:
方案1:使用窗口函数(推荐,兼容大部分现代数据库 MySQL 8+/PostgreSQL/SQL Server等)
窗口函数的计算范围不受GROUP BY分组限制,直接取2021年全量支出的总和即可:
SELECT [Expense Category], SUM(Value) AS category_total, ROUND(SUM(Value) * 100.0 / SUM(SUM(Value)) OVER(), 2) AS percentage_of_total FROM expenses WHERE Year = 2021 GROUP BY [Expense Category] ORDER BY category_total DESC
- 说明:
SUM(SUM(Value)) OVER()里内层的SUM(Value)是分组后的类别总金额,外层的OVER()不加分区条件,会计算所有分组的类别总金额之和,也就是2021年全部支出总金额。乘以100.0是为了避免整数除法得到0的问题,示例中用ROUND保留了两位小数方便阅读,你可以根据需求调整精度。
方案2:使用标量子查询(兼容不支持窗口函数的旧版数据库)
如果你的数据库版本不支持窗口函数,可以单独查询全局总支出作为分母:
SELECT [Expense Category], SUM(Value) AS category_total, ROUND(SUM(Value) * 100.0 / (SELECT SUM(Value) FROM expenses WHERE Year = 2021), 2) AS percentage_of_total FROM expenses WHERE Year = 2021 GROUP BY [Expense Category] ORDER BY category_total DESC
- 说明:子查询会独立计算2021年的全部支出总和,和外层的分组查询互不影响,可以直接用作占比计算的分母。
内容的提问来源于stack exchange,提问作者Lucian Mardale
相关产品推荐
相关产品推荐

