SQL是业务数据统计的核心工具,通过合理的语句编写可以快速完成各类业务指标的计算,支撑业务决策分析。不同的统计场景需要匹配不同的分析方法,掌握这些方法是开发者必备的技能。

基础聚合函数统计方法
最基础的业务统计通常依赖聚合函数实现,这类方法适合单维度、单指标的简单统计场景,比如统计总用户数、总订单金额、平均客单价等。
常用的聚合函数包括COUNT()、SUM()、AVG()、MAX()、MIN(),使用时可以结合DISTINCT关键字去重统计。
示例:统计平台总用户数、总订单金额、平均订单金额
-- 统计用户总数、订单总金額、平均订单金额
SELECT
COUNT(DISTINCT user_id) AS total_user_count,
SUM(order_amount) AS total_order_amount,
AVG(order_amount) AS avg_order_amount
FROM order_table
WHERE order_status = '已完成';
分组统计分析方法
当需要按某个维度拆分统计指标时,需要使用GROUP BY子句实现分组统计,比如按日统计新增用户数、按商品类别统计销量、按地区统计营收等。
分组后可以通过HAVING子句对统计结果进行过滤,筛选出符合要求的分组数据,注意HAVING和WHERE的区别:WHERE过滤原始数据,HAVING过滤分组后的聚合结果。
示例:按日期统计每日新增用户数和订单总金额
-- 按日期分组统计每日新增用户和订单总金额
SELECT
DATE(create_time) AS stat_date,
COUNT(DISTINCT user_id) AS daily_new_user,
SUM(order_amount) AS daily_total_amount
FROM order_table
WHERE order_status = '已完成'
GROUP BY DATE(create_time)
HAVING daily_total_amount > 10000
ORDER BY stat_date DESC;
多维度交叉统计方法
业务分析中经常需要同时按多个维度统计指标,比如同时按地区和商品类别统计销量,此时可以在GROUP BY中指定多个分组字段,实现交叉维度的统计。
如果需要同时展示不同维度的汇总数据,可以使用WITH ROLLUP关键字,它会在分组结果后追加各级维度的汇总行。
示例:按地区和商品类别统计订单数量,同时输出地区和总汇总
-- 多维度分组统计,附带汇总行
SELECT
COALESCE(region, '全部地区') AS region,
COALESCE(category, '全部类别') AS category,
COUNT(order_id) AS order_count
FROM order_table
WHERE order_status = '已完成'
GROUP BY region, category WITH ROLLUP;
子查询与窗口函数统计方法
对于需要同时计算明细数据和聚合指标的场景,比如统计每个用户的订单金额占全部订单总金额的比例,或者计算用户的订单排名,使用子查询或者窗口函数会更高效。
窗口函数可以在不分组的情况下,对每行数据计算对应的聚合值,常用的窗口函数包括ROW_NUMBER()、RANK()、SUM() OVER()等。
示例:统计每个用户的订单总金额,以及该金额占全平台订单总金额的比例
-- 使用窗口函数计算全平台总订单金额,再计算占比
SELECT
user_id,
user_total_amount,
total_amount,
ROUND(user_total_amount / total_amount * 100, 2) AS amount_ratio
FROM (
SELECT
user_id,
SUM(order_amount) OVER(PARTITION BY user_id) AS user_total_amount,
SUM(order_amount) OVER() AS total_amount
FROM order_table
WHERE order_status = '已完成'
) t
GROUP BY user_id, user_total_amount, total_amount;
复杂业务统计的优化建议
当统计的数据量较大时,需要注意SQL的性能优化,避免全表扫描。首先要确保统计涉及的过滤字段、分组字段上有合适的索引,其次尽量减少不必要的DISTINCT使用,避免重复计算。如果统计逻辑过于复杂,可以拆分成多个临时表分步计算,提升可读性和执行效率。
- 优先对统计范围做明确的
WHERE过滤,缩小数据扫描范围 - 分组字段尽量选择基数小的字段,减少分组计算开销
- 避免在统计查询中使用
SELECT *,只查询需要的字段 - 定期清理统计涉及的表中的无效历史数据,控制表数据量
SQL数据统计aggregate_functiongroup_by子查询修改时间:2026-07-15 01:36:11