如何编写SQL查询获取订单平均包含的商品数量?
问题背景
现有Order_item表结构及数据如下:
| Order-id | item-id |
|---|---|
| 1 | 45 |
| 4 | 45 |
| 4 | 57 |
| 5 | 68 |
| 5 | 32 |
| 6 | 68 |
需要计算平均每个订单包含的商品数量,手动计算结果为6个商品 ÷ 4个订单 = 1.5个商品/订单。
已尝试的SQL查询:
select count(item-id), order-id from order_item group by order-id
得到结果:
| Order-id | count |
|---|---|
| 1 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 1 |
解决方法
有两种直接得到结果的SQL写法:
方法1:直接计算总商品数与唯一订单数的比值
这种方式更高效,无需嵌套子查询:
SELECT COUNT(item_id) / COUNT(DISTINCT order_id) AS avg_items_per_order FROM order_item;
COUNT(item_id):统计所有商品的总数量(共6条记录,对应6个商品)COUNT(DISTINCT order_id):统计唯一的订单数量(共4个订单)- 两者相除得到平均每个订单的商品数,结果为1.5
方法2:基于分组结果求平均值
利用你已写好的分组查询作为子查询,对每个订单的商品数求平均:
SELECT AVG(item_count) AS avg_items_per_order FROM ( SELECT COUNT(item_id) AS item_count FROM order_item GROUP BY order_id ) AS order_item_counts;
- 子查询先统计每个订单的商品数量,得到你之前的分组结果
- 外层查询用
AVG()函数对这些商品数求平均,最终得到1.5
内容的提问来源于stack exchange,提问作者mountain_climber
相关产品推荐
相关产品推荐

