2026-07-29 18:07:35
SQL分组查询通过GROUP BY实现数据分类统计,是数据分析中不可或缺的核心功能。掌握其用法和优化技巧能显著提升数据处理效率。
GROUP BY的核心功能是按指定列分组,将相同值的行归为一组,然后对每组应用聚合函数进行统计分析。

以订单表orders为例,包含customer_id和order_amount字段:
SELECT customer_id, SUM(order_amount) AS total_amountFROM ordersGROUP BY customer_id;
此查询会:
当需要过滤分组结果时,使用HAVING子句(必须位于GROUP BY之后):
SELECT customer_id, SUM(order_amount) AS total_amountFROM ordersGROUP BY customer_idHAVING SUM(order_amount) > 1000;
关键区别:
错误示例:
SELECT customer_id, order_date, SUM(order_amount)FROM ordersGROUP BY customer_id; -- 缺少order_date修正方法:
典型场景:
解决方案:
-- 统一大小写后再分组SELECT UPPER(customer_id), COUNT(*)FROM ordersGROUP BY UPPER(customer_id);4. NULL值处理策略常见误区:
ROLLUP示例:
-- 生成小计和总计SELECT YEAR(order_date) as year, MONTH(order_date) as month, SUM(order_amount) as totalFROM ordersGROUP BY ROLLUP(YEAR(order_date), MONTH(order_date));CUBE示例:
-- 生成所有组合的汇总SELECT department, job_title, AVG(salary)FROM employeesGROUP BY CUBE(department, job_title);3. GROUPING SETS灵活组合-- 合并多种分组方式SELECT CASE WHEN GROUPING(department) = 1 THEN 'All Departments' ELSE department END as department, CASE WHEN GROUPING(job_title) = 1 THEN 'All Jobs' ELSE job_title END as job_title, AVG(salary)FROM employeesGROUP BY GROUPING SETS ( (department, job_title), (department), (job_title), ());4. CTE提升可读性WITH customer_orders AS ( SELECT customer_id, order_amount, order_date FROM orders WHERE order_date > DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR))SELECT customer_id, COUNT(*) as order_count, SUM(order_amount) as total_spentFROM customer_ordersGROUP BY customer_id;销售分析:
按地区/产品分类统计销售额
识别高价值客户群体
运营监控:
计算各类设备的平均故障间隔
分析不同时段的用户活跃度
财务报告:
生成多级收入汇总报表
计算各部门费用占比
库存管理:
按仓库/品类统计库存周转率
识别滞销商品
掌握这些GROUP BY的高级用法和优化技巧,能够应对从简单统计到复杂分析的各种业务需求,显著提升数据处理效率和分析深度。