SQL 数值函数如何计算累计百分比?

上周。
我那个朋友问了我SQL累计百分比怎么算。
我给他捋了一遍。

核心就俩步骤。
先算累计和。
再算百分比。

累计和用SUM()OVER(ORDER BY...)。
比如按销售额降序排。

总和用SUM()OVER()。
全表的总和。

百分比就是累计和除以总和。
记得乘1 00.0。
还有ROUND函数保留两位小数。

比如这个例子:
sql SELECT region, amount, SUM(amount) OVER(ORDER BY amount DESC) AS 累计销售额, ROUND((SUM(amount) OVER(ORDER BY amount DESC) 1 00.0) / SUM(amount) OVER(), 2 ) AS 累计百分比 FROM sales;
这里按amount降序排。
1 00.0保证是浮点数。

要是按地区分组。
就要加PARTITION BY:
sql SELECT category, product, sales_amount, SUM(sales_amount) OVER(PARTITION BY category ORDER BY sales_amount DESC) AS 分组累计销售额, ROUND((SUM(sales_amount) OVER(PARTITION BY category ORDER BY sales_amount DESC) 1 00.0) / SUM(sales_amount) OVER(PARTITION BY category), 2 ) AS 分组累计百分比 FROM products;
注意点不少。
数据类型要是数值类型。
排序字段得选对。
分组字段也得一致。

性能可能是个问题。
大数据表建议加索引。

1 00.0不能写成1 00。
会变成整数除法。
NULL值得处理。
比如用COALESCE(column,0)。
重复值排序要注意。
可能要加ROW_NUMBER()。

就这样。
大部分情况都能搞定。

Oracle SQL中如何进行除法操作

这就是坑,整数除法可能导致截断,用浮点数或结合函数控制精度。
别直接除零,用CASE或NVL处理异常。