单均消费金额指的是某个统计范围内,所有订单的总消费金额除以订单总数量得到的平均值,是反映店铺消费水平的核心指标。在SQL中我们可以通过AVG聚合函数配合分组语法快速完成这个统计。

单均消费金额的计算逻辑
单均消费金额的计算公式非常明确:单均消费金额 = 总消费金额 / 订单数量。对应到数据库表中,假设我们有一张订单表order_info,其中包含店铺IDshop_id、订单金额order_amount字段,那么每个店铺的单均消费就是该店铺下所有order_amount的平均值。
AVG函数的基础用法
AVG是SQL中常用的聚合函数,用于计算某列数值的平均值,会自动忽略NULL值。基础语法如下:
-- 计算全表所有订单的单均消费金额 SELECT AVG(order_amount) AS avg_order_amount FROM order_info;
上面的语句会返回整个订单表的平均订单金额,但如果我们需要按店铺拆分统计,就需要结合分组语法。
结合GROUP BY实现店铺分组统计
GROUP BY语法可以将数据按照指定字段分成多个组,再对每个组执行聚合计算。要计算每个店铺的单均消费,我们只需要按shop_id分组,再对每个组的order_amount求平均即可。
完整示例代码
假设order_info表的结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| order_id | INT | 订单唯一ID |
| shop_id | INT | 店铺ID |
| order_amount | DECIMAL(10,2) | 订单金额 |
统计每个店铺单均消费的SQL语句如下:
-- 按店铺分组计算单均消费金额
SELECT
shop_id,
AVG(order_amount) AS avg_order_amount,
COUNT(order_id) AS order_count, -- 可选:统计每个店铺的订单总数
SUM(order_amount) AS total_amount -- 可选:统计每个店铺的总消费金额
FROM order_info
GROUP BY shop_id
ORDER BY avg_order_amount DESC; -- 按单均消费从高到低排序
执行上述语句后,会得到每个店铺的ID、单均消费金额、订单总数、总消费金额,方便我们对比不同店铺的经营情况。
常见使用误区
- 忘记写GROUP BY子句:如果只使用AVG函数不分组,会得到全表的平均值,无法区分不同店铺。
- SELECT中出现了非聚合字段:在标准SQL中,SELECT后面如果使用了GROUP BY,那么只能出现分组字段和聚合函数,否则会报错或者得到不确定的结果。
- 没有处理NULL值:如果
order_amount存在NULL值,AVG函数会自动忽略,不需要额外处理,但如果需要把NULL当作0计算,可以用COALESCE(order_amount,0)转换。
扩展场景
如果需要统计某个时间段内每个店铺的单均消费,只需要在WHERE子句中添加时间过滤条件即可:
-- 统计2024年1月每个店铺的单均消费
SELECT
shop_id,
AVG(order_amount) AS avg_order_amount
FROM order_info
WHERE order_create_time >= '2024-01-01'
AND order_create_time < '2024-02-01'
GROUP BY shop_id;
如果需要同时统计多个维度的单均消费,比如按店铺和城市分组,只需要在GROUP BY后面添加对应的字段即可:
-- 按店铺和城市分组计算单均消费
SELECT
shop_id,
city,
AVG(order_amount) AS avg_order_amount
FROM order_info
GROUP BY shop_id, city;