导读:本期聚焦于小伙伴创作的《如何在SQL查询中计算每个产品的销售占比_利用SUM OVER实现总分母计算》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在SQL查询中计算每个产品的销售占比_利用SUM OVER实现总分母计算》有用,将其分享出去将是对创作者最好的鼓励。

在电商、零售等业务的数据分析工作中,经常需要统计每个产品的销售额占所有产品总销售额的比例,也就是销售占比,用来判断单个产品的贡献度。传统实现方式需要先查询总销售额,再和产品销售额表做关联计算,逻辑相对复杂,而使用SUM OVER窗口函数可以直接在一次查询中完成总分母的计算,简化整个实现过程。

如何在SQL查询中计算每个产品的销售占比_利用SUM OVER实现总分母计算

SUM OVER窗口函数基础语法

SUM OVER是SQL中窗口函数的一种,用于对指定窗口内的数据进行求和计算,基本语法如下:

-- 基础语法结构
SUM(求和字段) OVER (PARTITION BY 分组字段 ORDER BY 排序字段 ROWS 窗口范围)

如果不指定PARTITION BY,则会对全表数据进行求和;如果不指定ORDER BY和窗口范围,则默认对当前分区内的所有行进行求和,这个特性刚好可以用来计算总销售额作为分母。

产品销售占比计算实现步骤

1. 准备测试数据

首先创建产品销售数据表并插入测试数据,表结构包含产品ID、产品名称和销售额三个字段:

-- 创建产品销售表
CREATE TABLE product_sales (
    product_id INT,
    product_name VARCHAR(50),
    sales_amount DECIMAL(10,2)
);

-- 插入测试数据
INSERT INTO product_sales (product_id, product_name, sales_amount) VALUES
(1, '产品A', 1500.00),
(2, '产品B', 3000.00),
(3, '产品C', 2500.00),
(4, '产品D', 1000.00),
(5, '产品E', 2000.00);

2. 使用SUM OVER计算总销售额

通过SUM OVER窗口函数不指定分区条件,直接对全表的sales_amount求和,得到所有产品的总销售额:

-- 查询每个产品销售额和总销售额
SELECT 
    product_id,
    product_name,
    sales_amount,
    -- 不指定PARTITION BY,对全表销售额求和作为总销售额
    SUM(sales_amount) OVER () AS total_sales
FROM product_sales;

上述查询的结果中,每一行都会包含total_sales字段,值为所有产品销售额的总和,也就是10000.00。

3. 计算销售占比

用单个产品的销售额除以总销售额,再乘以100得到百分比形式的销售占比:

-- 计算每个产品的销售占比
SELECT 
    product_id,
    product_name,
    sales_amount,
    total_sales,
    -- 计算占比,保留两位小数
    ROUND(sales_amount / total_sales * 100, 2) AS sales_ratio_percent
FROM (
    SELECT 
        product_id,
        product_name,
        sales_amount,
        SUM(sales_amount) OVER () AS total_sales
    FROM product_sales
) t;

最终查询结果如下:

product_idproduct_namesales_amounttotal_salessales_ratio_percent
1产品A1500.0010000.0015.00
2产品B3000.0010000.0030.00
3产品C2500.0010000.0025.00
4产品D1000.0010000.0010.00
5产品E2000.0010000.0020.00

传统写法与SUM OVER写法对比

传统计算销售占比的方式需要先查询总销售额,再和产品表做关联:

-- 传统写法
SELECT 
    p.product_id,
    p.product_name,
    p.sales_amount,
    t.total_sales,
    ROUND(p.sales_amount / t.total_sales * 100, 2) AS sales_ratio_percent
FROM product_sales p
-- 关联总销售额子查询
CROSS JOIN (
    SELECT SUM(sales_amount) AS total_sales FROM product_sales
) t;

两种写法的差异如下:

  • 传统写法需要两次扫描产品表,一次算总销售额,一次取产品数据,而SUM OVER写法只需要一次全表扫描,执行效率更高。
  • 传统写法需要额外的子查询和关联操作,查询逻辑更复杂,SUM OVER写法逻辑更简洁,可读性更强。
  • 如果后续需要扩展计算逻辑,比如按品类分组计算占比,SUM OVER只需要调整PARTITION BY条件即可,传统写法需要修改子查询和关联条件,改动成本更高。

注意事项

使用SUM OVER计算销售占比时需要注意几个问题:

  • 如果销售额字段可能存在NULL值,需要先用COALESCE函数将NULL转换为0,避免计算结果出现NULL。
  • 如果总销售额为0,需要做除零判断,避免查询报错,可以通过CASE WHEN语句处理这种情况。
  • 不同数据库对窗口函数的支持略有差异,上述语法适用于MySQL 8.0+、PostgreSQL、SQL Server等主流数据库,如果是低版本数据库可能需要调整实现方式。

SQLSUM_OVER销售占比窗口函数修改时间:2026-06-12 05:57:19

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。