如何在SQL中计算各goods_services对总金额的贡献百分比?
如何在SQL中计算各分类金额占总金额的百分比
针对你的需求——统计每个goods_services分类的金额总和占全局总金额的百分比,下面提供两种可靠的实现方案,同时分析你之前查询的问题所在:
方案一:GROUP BY + 子查询获取全局总金额
这种方法逻辑直观,先按分类分组计算每组金额,再除以整个表的总金额得到百分比:
SELECT goods_services, SUM(amount) AS 分类总金额, ROUND((SUM(amount) / (SELECT SUM(amount) FROM 你的表名)) * 100, 2) AS 占比百分比 FROM 你的表名 GROUP BY goods_services ORDER BY 占比百分比 DESC;
GROUP BY goods_services:按服务/商品分类分组,计算每组的金额总和- 子查询
(SELECT SUM(amount) FROM 你的表名):获取所有记录的总金额 ROUND(..., 2):将百分比保留两位小数,可按需调整位数
方案二:窗口函数实现(无需GROUP BY)
如果你更倾向于用窗口函数,可以通过全局窗口获取总金额,结合分组窗口计算分类总和:
SELECT DISTINCT goods_services, SUM(amount) OVER(PARTITION BY goods_services) AS 分类总金额, ROUND((SUM(amount) OVER(PARTITION BY goods_services) / SUM(amount) OVER()) * 100, 2) AS 占比百分比 FROM 你的表名 ORDER BY 占比百分比 DESC;
SUM(amount) OVER(PARTITION BY goods_services):计算每个分类的金额总和SUM(amount) OVER():不带分区参数,获取全局所有记录的总金额DISTINCT:因为原表同一分类有多条记录,窗口函数会为每条记录生成相同的结果,去重后得到唯一的分类统计行
你之前查询的问题分析
你写的查询中:
SELECT Goods_services, SUM(Amount)OVER(PARTITION BY Goods_services)/SUM(Amount)*100 FROM.... ORDER BY.....
问题在于SUM(Amount)没有窗口修饰符,在未加GROUP BY的情况下,这个函数会被视为聚合函数,与未聚合的Goods_services列冲突(多数SQL方言会报错);即使加了GROUP BY Goods_services,此时SUM(Amount)是每组的总和,而非全局总金额,因此计算出的结果不是你想要的占比。
内容的提问来源于stack exchange,提问作者Inioluwa Tonade
相关产品推荐
相关产品推荐

