SQL分组group by技巧大全:高效数据分析必备
·
SQL分组数据方法总结

分组方法对比表
| 方法 | 语法 | 功能 | 适用场景 |
|---|---|---|---|
GROUP BY |
GROUP BY column |
基础分组 | 按列分类统计 |
GROUP BY ROLLUP |
GROUP BY ROLLUP(columns) |
生成小计和总计 | 层次化汇总 |
GROUP BY CUBE |
GROUP BY CUBE(columns) |
生成所有组合 | 多维分析 |
GROUP BY GROUPING SETS |
GROUP BY GROUPING SETS(sets) |
自定义分组组合 | 灵活汇总需求 |
分组配合函数表
| 函数类型 | 常用函数 | 说明 |
|---|---|---|
| 聚合函数 | COUNT, SUM, AVG, MAX, MIN |
对分组数据进行计算 |
| 分组标识 | GROUPING |
标识汇总行 |
| 窗口函数 | ROW_NUMBER, RANK, DENSE_RANK |
分组内排序 |
SQL分组数据详细示例
1. 基础 GROUP BY 分组
-- 按部门分组统计员工信息
SELECT
department AS department_name, -- 分组字段
COUNT(*) AS employee_count, -- 统计每部门员工数
AVG(salary) AS average_salary, -- 计算每部门平均薪资
MAX(salary) AS highest_salary, -- 每部门最高薪资
MIN(hire_date) AS earliest_hire_date -- 每部门最早入职日期
FROM employees
GROUP BY department -- 按部门分组
ORDER BY employee_count DESC; -- 按员工数降序排列
-- 多列分组统计销售数据
SELECT
region, -- 地区分组
product_category, -- 产品类别分组
COUNT(*) AS order_count, -- 订单数量
SUM(order_amount) AS total_sales, -- 销售总额
AVG(order_amount) AS avg_order_value -- 平均订单价值
FROM sales_orders
GROUP BY region, product_category -- 按地区和产品类别双重分组
HAVING SUM(order_amount) > 10000 -- 筛选销售总额大于10000的分组
ORDER BY region, total_sales DESC;
2. GROUP BY ROLLUP 层次化分组
-- 使用ROLLUP生成销售数据的层次化汇总
SELECT
region, -- 地区字段
department, -- 部门字段
COUNT(*) AS sales_count, -- 销售笔数
SUM(amount) AS total_revenue, -- 总收入
GROUPING(region) AS region_grouping, -- 标识地区汇总行
GROUPING(department) AS dept_grouping -- 标识部门汇总行
FROM sales_data
GROUP BY ROLLUP(region, department) -- 生成层次化汇总
ORDER BY
GROUPING(region), -- 先显示明细行
GROUPING(department), -- 再显示小计行
region, department;
3. GROUP BY CUBE 多维分组
-- 使用CUBE生成所有可能的分组组合
SELECT
region, -- 地区维度
product_line, -- 产品线维度
customer_type, -- 客户类型维度
COUNT(*) AS transaction_count, -- 交易次数
SUM(revenue) AS total_revenue, -- 总收入
AVG(revenue) AS avg_revenue -- 平均收入
FROM sales_transactions
GROUP BY CUBE(region, product_line, customer_type) -- 生成所有组合
ORDER BY
GROUPING(region),
GROUPING(product_line),
GROUPING(customer_type);
4. GROUP BY GROUPING SETS 自定义分组
-- 使用GROUPING SETS定义特定的分组组合
SELECT
region, -- 地区字段
department, -- 部门字段
product_category, -- 产品类别字段
COUNT(*) AS record_count, -- 记录数
SUM(sales_amount) AS total_sales -- 销售总额
FROM sales_records
-- 自定义分组集合:总计、按地区、按部门、按类别
GROUP BY GROUPING SETS (
(), -- 总计(空分组)
(region), -- 按地区分组
(department), -- 按部门分组
(product_category) -- 按产品类别分组
)
ORDER BY
GROUPING(region),
GROUPING(department),
GROUPING(product_category);
5. 分组配合窗口函数
-- 分组内使用窗口函数进行排名分析
SELECT
department, -- 部门分组
employee_name, -- 员工姓名
salary, -- 薪资
-- 计算部门内薪资排名
RANK() OVER (
PARTITION BY department -- 按部门分组
ORDER BY salary DESC -- 按薪资降序排名
) AS salary_rank,
-- 计算部门内薪资百分位
PERCENT_RANK() OVER (
PARTITION BY department
ORDER BY salary
) AS salary_percentile,
-- 计算部门累计薪资
SUM(salary) OVER (
PARTITION BY department
ORDER BY salary DESC
) AS cumulative_salary
FROM employees
ORDER BY department, salary_rank;
使用建议
- 选择合适的分组方法: 根据业务需求选择基础分组或高级分组功能
- 性能优化: 大数据量分组时考虑创建适当的索引
- 结果筛选: 使用
HAVING子句对分组结果进行筛选 - NULL值处理: 注意分组字段中NULL值的处理方式
- 排序控制: 合理使用
ORDER BY控制分组结果显示顺序
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)