SQL 窗口函数如何计算商品销量占分类总量的比例
时间:2026-08-22 | 作者:星际追番人 | 阅读:0要想准确计算分类销量占比,分母得用SUM(sales) OVER(PARTITION BY category),然后再除以当前行的sales。这里面有两个要点需要注意,一是要用NULLIF函数防止除零错误,二是要显式转换为浮点数,以避免截断。这种计算方式在MySQL 8.0+版本中是支持的,如果是旧版本的MySQL,就需要用子查询来替代了。
用 SUM() OVER() 计算分类总销量再做除法
利用窗口函数计算占比,关键在于先通过 SUM(sales) OVER(PARTITION BY category) 来获取每个分类的总销量,然后用当前行的销量除以它。这里要特别注意,不能遗漏 PARTITION BY 这个子句,如果不加上,那计算出来的就会是全表的总和,结果肯定就全错了。
- 写法示例:
sales / SUM(sales) OVER(PARTITION BY category) - 如果
sales是整数,除法结果可能被截断为 0(尤其在 PostgreSQL 或 SQL Server 中),务必显式转成浮点:sales::DECIMAL / SUM(sales) OVER(PARTITION BY category)或CAST(sales AS FLOAT) / SUM(sales) OVER(PARTITION BY category) - MySQL 8.0+ 支持该写法;MySQL 5.7 及更早不支持窗口函数,得用关联子查询替代
遇到 NULL 或零值分类时怎么避免除零错误
当某分类下所有 sales 都为 0,SUM() OVER() 返回 0,直接除会报错或得 NULL。不能靠业务数据“保证不为零”,得主动防御。
- 用
NULLIF()把分母变 NULL:sales / NULLIF(SUM(sales) OVER(PARTITION BY category), 0),结果自动为 NULL(安全) - 想补成 0 而不是 NULL?套一层
COALESCE():COALESCE(sales / NULLIF(SUM(sales) OVER(PARTITION BY category), 0), 0) - 某些数据库(如 Oracle)对除零抛异常,必须用
NULLIF;SQLite 则默认返回 NULL,但行为不统一,别依赖
需要保留小数位数?别用 ROUND() 糊弄精度
占比常需展示百分比(如 12.34%),但 ROUND(x, 4) 只控制位数,不解决浮点误差累积问题。比如 0.1 + 0.2 ≠ 0.3,累加占比可能超 100%。
- 推荐先算精确值,最后格式化显示:
ROUND(100 * sales / NULLIF(SUM(sales) OVER(PARTITION BY category), 0), 2) - 若要严格满足“各占比之和 = 100%”,得用
ROW_NUMBER()配合调整最后一行——这是业务规则,SQL 本身不负责这种补偿逻辑 - 别在窗口函数里嵌套多层
ROUND(),每 round 一次就引入一次舍入误差
实际跑的时候,最常卡在类型隐式转换和除零上,尤其是从旧系统迁移过来的数据,空值和零值混在一起,不加 NULLIF 就崩。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 迅捷路由器怎么调信号最强,设置时要注意什么?
- 时间:2026-08-27
-
- vivo浏览器怎么卸不掉?原因和解决方法在这里
- 时间:2026-08-27
-
- OPPO R11s黑屏了,怎么强制恢复出厂设置?
- 时间:2026-08-27
-
- 飞利浦显示器包装盒有生产日期和保修期吗?怎么看?
- 时间:2026-08-27
-
- 联想新平板开机必须联网吗?怎么做?
- 时间:2026-08-27
-
- 平板横竖屏切换设置与问题解决
- 时间:2026-08-27
-
- 移动电源容量怎么测?要准备哪些工具?
- 时间:2026-08-27
-
- 荣耀90 Pro防水吗?防水级别多少?怎么用才安全
- 时间:2026-08-27
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
