一、基础分组:GROUP BY与聚合函数
GROUP BY子句是SQL分组统计的基石,通过将数据按指定列分组,再结合聚合函数实现基础统计。例如在销售系统中统计各区域销售额:
SELECT region, SUM(amount) AS total_sales
FROM sales_data
GROUP BY region;
该查询将数据按销售区域分组,并计算每个区域的销售总额。聚合函数支持SUM、COUNT、AVG、MAX、MIN等,可满足不同统计需求。在处理天翼云上的电商数据时,可通过多字段组合实现更细粒度统计:
SELECT region, product_category,
COUNT(*) AS order_count,
AVG(amount) AS avg_order_value
FROM orders
WHERE order_date BETWEEN '2025-01-01' AND '2025-12-31'
GROUP BY region, product_category;
此查询统计各区域、各产品类别的订单数量及平均订单金额,WHERE子句先过滤时间范围,再分组统计。
二、条件分组:CASE WHEN与聚合函数
当需要按复杂条件分组时,CASE WHEN表达式与聚合函数的组合提供强大支持。例如在用户行为分析中,统计不同消费层级的用户数:
SELECT
CASE
WHEN total_spent > 5000 THEN '高价值用户'
WHEN total_spent > 1000 THEN '中价值用户'
ELSE '低价值用户'
END AS user_segment,
COUNT(*) AS user_count
FROM user_profiles
GROUP BY
CASE
WHEN total_spent > 5000 THEN '高价值用户'
WHEN total_spent > 1000 THEN '中价值用户'
ELSE '低价值用户'
END;
该查询将用户按消费金额分为三个层级,并统计各层级用户数量。部分数据库支持使用别名简化GROUP BY:
SELECT
CASE
WHEN total_spent > 5000 THEN '高价值用户'
WHEN total_spent > 1000 THEN '中价值用户'
ELSE '低价值用户'
END AS user_segment,
COUNT(*) AS user_count
FROM user_profiles
GROUP BY user_segment;
三、高级分组:ROLLUP、CUBE与GROUPING SETS
天翼云数据库支持SQL标准的高级分组功能,可生成多层级统计结果。ROLLUP用于生成层次化汇总,例如统计各区域、各省份及全国的销售总额:
SELECT region, province, SUM(amount) AS sales_total
FROM sales_data
GROUP BY ROLLUP(region, province);
结果包含三部分:
- 各省份销售明细
- 各区域汇总(province列为NULL)
- 全国总计(region和province列均为NULL)
CUBE则生成所有可能的维度组合,适用于多维分析:
SELECT region, product_category, SUM(amount) AS sales_total
FROM sales_data
GROUP BY CUBE(region, product_category);
该查询生成8种组合(包括空组合),适用于需要从不同维度分析数据的场景。GROUPING SETS允许自定义分组集,例如只统计区域和产品类别的单独汇总:
SELECT region, product_category, SUM(amount) AS sales_total
FROM sales_data
GROUP BY GROUPING SETS ((region), (product_category));
四、透视表:PIVOT操作
天翼云数据库(SQL Server版本)支持PIVOT操作,可将行数据转换为列数据,生成透视表。例如将各产品类别的销售金额转换为列:
SELECT *
FROM (
SELECT region, product_category, amount
FROM sales_data
) AS source_table
PIVOT (
SUM(amount)
FOR product_category IN ([Electronics], [Clothing], [Food])
) AS pivot_table;
该查询生成包含各区域、各产品类别销售金额的透视表。对于动态列名场景,需结合动态SQL实现。
五、性能优化策略
在天翼云大数据量环境下,分组统计性能至关重要。以下优化策略可显著提升查询效率:
-
索引优化:为分组列和筛选列创建复合索引,例如在sales_data表上创建(region, product_category, order_date)索引。
-
覆盖索引:确保查询所需列均包含在索引中,减少回表操作。
-
分区表:对大表按时间或区域分区,例如按月分区销售数据表。
-
物化视图:对高频统计查询创建物化视图,例如每日销售汇总视图:
CREATE MATERIALIZED VIEW daily_sales_summary AS
SELECT
TRUNC(order_date) AS sale_date,
region,
SUM(amount) AS total_sales,
COUNT(*) AS order_count
FROM sales_data
GROUP BY TRUNC(order_date), region;
- 查询重写:将复杂查询拆分为多个简单查询,在天翼云应用服务层合并结果。
六、实战案例:用户行为分析
以下是一个完整的用户行为分析案例,统计各渠道新用户的消费行为:
WITH new_users AS (
SELECT user_id, registration_channel
FROM users
WHERE registration_date BETWEEN '2025-01-01' AND '2025-12-31'
),
user_orders AS (
SELECT
nu.user_id,
nu.registration_channel,
o.order_id,
o.amount,
CASE
WHEN o.amount > 1000 THEN '大额订单'
ELSE '小额订单'
END AS order_type
FROM new_users nu
JOIN orders o ON nu.user_id = o.user_id
)
SELECT
registration_channel,
COUNT(DISTINCT user_id) AS new_user_count,
COUNT(order_id) AS total_orders,
SUM(amount) AS total_spent,
COUNT(CASE WHEN order_type = '大额订单' THEN 1 END) AS large_orders,
SUM(CASE WHEN order_type = '大额订单' THEN amount ELSE 0 END) AS large_order_amount
FROM user_orders
GROUP BY registration_channel
ORDER BY total_spent DESC;
该查询统计各渠道新用户数量、订单总数、消费总额、大额订单数及大额订单金额,为渠道效果评估提供数据支持。
结语
SQL分组统计是数据分析的基础技能,通过灵活运用GROUP BY、CASE WHEN、高级分组函数及PIVOT操作,可满足各种复杂统计需求。在天翼云环境下,结合索引优化、分区表、物化视图等技术,可显著提升大数据量下的统计性能。开发者应根据具体业务场景选择合适的分组方式,构建高效的数据分析解决方案。