导读:本期聚焦于小伙伴创作的《如何用SQL统计分组内不同业务类型的占比?利用聚合函数实现分组占比计算》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用SQL统计分组内不同业务类型的占比?利用聚合函数实现分组占比计算》有用,将其分享出去将是对创作者最好的鼓励。

在业务数据分析工作中,按指定维度分组后统计每组内不同业务类型的占比是高频需求,比如按地区分组统计各业务类型的订单占比,按部门分组统计各项目类型的工时占比。这类需求可以通过SQL的聚合函数配合分组语法高效实现,不需要额外导出数据到外部工具处理。

如何用SQL统计分组内不同业务类型的占比?利用聚合函数实现分组占比计算

核心计算逻辑

分组内不同业务类型占比的计算本质是:某业务类型的记录数 / 该分组的总记录数 * 100%。要实现这个计算,首先需要用GROUP BY完成分组,再结合聚合函数分别获取分子分母的数值,最后做除法运算得到占比结果。

常用聚合函数适配方案

1. 通用方案:COUNT配合条件判断

这种方式兼容性最好,几乎所有关系型数据库都支持,核心是用CASE WHEN结合COUNT计算符合条件的记录数,再用COUNT(*)获取分组总记录数。

假设我们有订单表order_table,包含字段region(地区,分组维度)、business_type(业务类型),需要统计每个地区下不同业务类型的订单占比,示例代码如下:

-- 统计每个地区不同业务类型的订单占比
SELECT
    region,
    business_type,
    -- 计算当前业务类型的订单数
    COUNT(CASE WHEN business_type = t.business_type THEN 1 END) AS type_count,
    -- 计算该地区总订单数
    COUNT(*) AS total_count,
    -- 计算占比,保留2位小数
    ROUND(
        COUNT(CASE WHEN business_type = t.business_type THEN 1 END) * 100.0 / COUNT(*),
        2
    ) AS type_ratio
FROM order_table t
GROUP BY region, business_type
ORDER BY region, type_ratio DESC;

2. MySQL专用:SUM配合布尔值转换

MySQL中布尔表达式的结果会转换为1(真)和0(假),因此可以用SUM直接累加符合条件的记录数,代码更简洁。

-- MySQL环境统计分组内业务类型占比
SELECT
    region,
    business_type,
    SUM(business_type = t.business_type) AS type_count,
    COUNT(*) AS total_count,
    ROUND(SUM(business_type = t.business_type) * 100.0 / COUNT(*), 2) AS type_ratio
FROM order_table t
GROUP BY region, business_type
ORDER BY region, type_ratio DESC;

3. 窗口函数方案:适配支持窗口函数的数据库

如果数据库支持窗口函数(如PostgreSQL、SQL Server、MySQL8.0+),可以用SUM OVER直接获取分组总记录数,不需要重复写聚合逻辑。

-- 窗口函数实现分组占比统计
SELECT DISTINCT
    region,
    business_type,
    COUNT(*) OVER(PARTITION BY region, business_type) AS type_count,
    COUNT(*) OVER(PARTITION BY region) AS total_count,
    ROUND(
        COUNT(*) OVER(PARTITION BY region, business_type) * 100.0 / 
        COUNT(*) OVER(PARTITION BY region),
        2
    ) AS type_ratio
FROM order_table
ORDER BY region, type_ratio DESC;

注意事项

  • 除法运算时建议给分子乘以100.0而不是100,避免整数除法导致结果取整错误,比如2/5在整数除法下结果为0,乘以100.0后结果为40.0。
  • 如果分组内存在NULL值的业务类型,需要提前用COALESCE函数处理,避免统计结果偏差。
  • 不同数据库的四舍五入函数可能有差异,比如Oracle用ROUND,SQL Server也用ROUND,用法基本一致,按需调整即可。

结果示例

以上查询的结果会类似如下表格:

regionbusiness_typetype_counttotal_counttype_ratio
华东零售12030040.00
华东批发9030030.00
华东服务9030030.00
华南零售15040037.50

SQL聚合函数GROUP_BY业务类型占比修改时间:2026-06-17 06:42:28

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