在电商运营中,"分析订单销售情况" 是核心需求 ------ 比如 "统计每月销售额""找出销量最高的商品""分析不同地区用户的消费习惯" 等。这些需求都需要关联 "用户表""商品表""订单表" 三表数据,再通过 SQL 统计实现。今天我们从零搭建电商核心数据表,完整实现 6 个高频订单分析需求,代码可直接复制运行,帮你掌握电商数据分析的实战逻辑。
我整理了一份学习资料合集,包含考试、专业、课程等资料,还有游戏和软件合集。
学习资料合集文档https://www.kdocs.cn/l/cjchDXwklk1B
一、场景与表结构设计
电商订单分析的核心是 "人 - 货 - 单" 的关联:
- 用户表(user):记录用户基本信息(谁买的);
- 商品表(product):记录商品信息(买了什么);
- 订单表(order):记录订单交易信息(什么时候买、买了多少、花了多少钱)。
三表关联逻辑:通过 "用户 ID" 关联用户表和订单表,通过 "商品 ID" 关联商品表和订单表,形成完整的 "交易链路"。
二、第一步:创建数据表并插入测试数据
先创建三表并插入模拟数据(涵盖不同用户、商品、订单状态),为后续分析做准备。
1. 创建用户表(user)
sql
-- 创建用户表:存储用户基本信息
CREATE TABLE `user` (
user_id INT PRIMARY KEY AUTO_INCREMENT, -- 用户ID(自增主键)
user_name VARCHAR(20) NOT NULL, -- 用户名
user_phone CHAR(11) NOT NULL, -- 用户手机号
user_region VARCHAR(30) NOT NULL, -- 用户所在地区(如北京、上海)
register_time DATE NOT NULL -- 用户注册时间
);
2. 创建商品表(product)
sql
-- 创建商品表:存储商品信息
CREATE TABLE product (
product_id INT PRIMARY KEY AUTO_INCREMENT, -- 商品ID(自增主键)
product_name VARCHAR(50) NOT NULL, -- 商品名称
product_category VARCHAR(20) NOT NULL, -- 商品分类(如手机、家电、服装)
product_price DECIMAL(10,2) NOT NULL, -- 商品单价
product_stock INT NOT NULL -- 商品库存
);
3. 创建订单表(order)
sql
-- 创建订单表:存储订单交易信息(关联用户表和商品表)
CREATE TABLE `order` (
order_id INT PRIMARY KEY AUTO_INCREMENT, -- 订单ID(自增主键)
user_id INT NOT NULL, -- 关联用户表的用户ID
product_id INT NOT NULL, -- 关联商品表的商品ID
order_quantity INT NOT NULL, -- 购买数量
order_amount DECIMAL(10,2) NOT NULL, -- 订单金额(数量×单价)
order_time DATETIME NOT NULL, -- 下单时间
order_status VARCHAR(10) NOT NULL, -- 订单状态(已支付、待支付、已取消)
-- 外键约束:确保订单的用户ID在用户表中存在
FOREIGN KEY (user_id) REFERENCES `user`(user_id),
-- 外键约束:确保订单的商品ID在商品表中存在
FOREIGN KEY (product_id) REFERENCES product(product_id)
);
4. 插入测试数据
sql
-- 插入用户数据(5个用户,覆盖不同地区)
INSERT INTO `user` (user_name, user_phone, user_region, register_time)
VALUES
('张三', '13812345678', '北京', '2025-01-10'),
('李四', '13987654321', '上海', '2025-02-15'),
('王五', '13711112222', '广州', '2025-03-20'),
('赵六', '13633334444', '深圳', '2025-04-25'),
('孙七', '13555556666', '北京', '2025-05-30');
-- 插入商品数据(6个商品,覆盖不同分类)
INSERT INTO product (product_name, product_category, product_price, product_stock)
VALUES
('iPhone 15', '手机', 5999.00, 100),
('华为Mate 60', '手机', 4999.00, 80),
('小米空气净化器', '家电', 899.00, 50),
('美的电饭煲', '家电', 399.00, 120),
('优衣库纯棉T恤', '服装', 99.00, 200),
('耐克运动鞋', '服装', 599.00, 60);
-- 插入订单数据(12条订单,覆盖不同状态、时间、用户)
INSERT INTO `order` (user_id, product_id, order_quantity, order_amount, order_time, order_status)
VALUES
-- 张三的订单(北京用户)
(1, 1, 1, 5999.00, '2025-06-01 10:30:00', '已支付'),
(1, 3, 1, 899.00, '2025-06-15 14:20:00', '已支付'),
-- 李四的订单(上海用户)
(2, 2, 1, 4999.00, '2025-06-02 09:15:00', '已支付'),
(2, 5, 2, 198.00, '2025-07-05 11:40:00', '已支付'),
-- 王五的订单(广州用户)
(3, 4, 1, 399.00, '2025-06-03 16:50:00', '待支付'),
(3, 6, 1, 599.00, '2025-07-10 15:30:00', '已支付'),
-- 赵六的订单(深圳用户)
(4, 1, 1, 5999.00, '2025-06-05 08:45:00', '已取消'),
(4, 3, 2, 1798.00, '2025-07-12 13:10:00', '已支付'),
-- 孙七的订单(北京用户)
(5, 2, 1, 4999.00, '2025-06-08 12:20:00', '已支付'),
(5, 5, 3, 297.00, '2025-07-15 10:00:00', '已支付'),
(5, 6, 1, 599.00, '2025-08-01 09:30:00', '待支付'),
(5, 4, 1, 399.00, '2025-08-05 16:20:00', '已支付');
-- 验证数据:查看三表关联的基础信息
SELECT
o.order_id,
u.user_name,
u.user_region,
p.product_name,
p.product_category,
o.order_quantity,
o.order_amount,
o.order_status
FROM `order` o
JOIN `user` u ON o.user_id = u.user_id
JOIN product p ON o.product_id = p.product_id
LIMIT 5;
基础关联结果示例:
|----------|-----------|-------------|--------------|------------------|----------------|--------------|--------------|
| order_id | user_name | user_region | product_name | product_category | order_quantity | order_amount | order_status |
| 1 | 张三 | 北京 | iPhone 15 | 手机 | 1 | 5999.00 | 已支付 |
| 2 | 张三 | 北京 | 小米空气净化器 | 家电 | 1 | 899.00 | 已支付 |
| 3 | 李四 | 上海 | 华为 Mate 60 | 手机 | 1 | 4999.00 | 已支付 |
| 4 | 李四 | 上海 | 优衣库纯棉 T 恤 | 服装 | 2 | 198.00 | 已支付 |
| 5 | 王五 | 广州 | 美的电饭煲 | 家电 | 1 | 399.00 | 待支付 |
三、第二步:高频订单分析需求实现(6 个核心场景)
基于三表数据,实现电商运营中最常见的 6 个分析需求,每个需求包含 "需求描述→SQL 代码→结果说明"。
需求 1:统计 2025 年 6-7 月各月的总销售额(按月份分组)
需求描述:计算 2025 年 6 月和 7 月的 "已支付" 订单总金额,看两个月的销售表现。
核心逻辑:筛选 "已支付" 订单 + 按 "下单月份" 分组 + 聚合订单金额。
sql
SELECT
DATE_FORMAT(order_time, '%Y-%m') AS 月份, -- 提取下单时间的"年-月"
SUM(order_amount) AS 月总销售额, -- 聚合每月总销售额
COUNT(DISTINCT order_id) AS 月订单数 -- 统计每月订单数量(去重,避免重复订单)
FROM `order`
WHERE
order_status = '已支付' -- 只统计已支付订单
AND order_time BETWEEN '2025-06-01 00:00:00' AND '2025-07-31 23:59:59' -- 时间范围:6-7月
GROUP BY DATE_FORMAT(order_time, '%Y-%m') -- 按月份分组
ORDER BY 月份 ASC; -- 按月份升序排列
运行结果:
|---------|----------|------|
| 月份 | 月总销售额 | 月订单数 |
| 2025-06 | 17295.00 | 4 |
| 2025-07 | 7891.00 | 4 |
结果解读:6 月总销售额 17295 元,7 月 7891 元,6 月销售额是 7 月的 2.2 倍,可能 6 月有促销活动(如 618),7 月回归常态。
需求 2:分析各商品分类的销售情况(销量、销售额、占比)
需求描述:统计 "手机""家电""服装" 三大分类的总销量、总销售额,以及销售额占比,找出核心品类。
核心逻辑:三表关联(订单表→商品表)+ 按 "商品分类" 分组 + 计算占比。
sql
-- 先统计各分类的销量和销售额,再用子查询计算占比
SELECT
p.product_category AS 商品分类,
SUM(o.order_quantity) AS 总销量, -- 分类总销量
SUM(o.order_amount) AS 总销售额, -- 分类总销售额
-- 计算销售额占比:(分类销售额/总销售额)×100,保留2位小数
ROUND(
SUM(o.order_amount) / (SELECT SUM(order_amount) FROM `order` WHERE order_status = '已支付') * 100,
2
) AS 销售额占比(%)
FROM `order` o
JOIN product p ON o.product_id = p.product_id
WHERE o.order_status = '已支付' -- 只统计已支付订单
GROUP BY p.product_category -- 按商品分类分组
ORDER BY 总销售额 DESC; -- 按总销售额降序,突出核心品类
运行结果:
|------|-----|----------|-----------|
| 商品分类 | 总销量 | 总销售额 | 销售额占比 (%) |
| 手机 | 3 | 15997.00 | 69.32 |
| 家电 | 4 | 3995.00 | 17.23 |
| 服装 | 7 | 3191.00 | 13.45 |
结果解读:手机品类是核心品类,销售额占比近 70%,总销售额 15997 元;家电和服装占比相对较低,可针对性优化服装品类的推广策略。
需求 3:找出销量最高的前 3 个商品(按销量排序)
需求描述:统计所有 "已支付" 订单中,每个商品的总销量,找出销量 TOP3 的商品。
核心逻辑:三表关联 + 按 "商品 ID / 名称" 分组 + 按销量降序 + LIMIT 限制前 3。
sql
SELECT
p.product_id AS 商品ID,
p.product_name AS 商品名称,
p.product_category AS 商品分类,
SUM(o.order_quantity) AS 总销量, -- 商品总销量
SUM(o.order_amount) AS 总销售额 -- 商品总销售额
FROM `order` o
JOIN product p ON o.product_id = p.product_id
WHERE o.order_status = '已支付'
GROUP BY p.product_id, p.product_name, p.product_category -- 按商品唯一标识分组
ORDER BY 总销量 DESC -- 按销量降序
LIMIT 3; -- 取前3名
运行结果:
|-------|-----------|------|-----|---------|
| 商品 ID | 商品名称 | 商品分类 | 总销量 | 总销售额 |
| 5 | 优衣库纯棉 T 恤 | 服装 | 5 | 495.00 |
| 3 | 小米空气净化器 | 家电 | 3 | 2697.00 |
| 1 | iPhone 15 | 手机 | 1 | 5999.00 |
结果解读:优衣库纯棉 T 恤销量最高(5 件),但因单价低,总销售额不高;iPhone 15 虽销量仅 1 件,但单价高,销售额最高,符合 "高单价低销量" 的特点。
需求 4:分析不同地区用户的消费情况(客单价、订单数)
需求描述:统计各地区用户的 "已支付" 订单数、总消费金额、客单价(总金额 / 订单数),了解地区消费能力。
核心逻辑:三表关联(订单表→用户表)+ 按 "地区" 分组 + 计算客单价。
sql
SELECT
u.user_region AS 用户地区,
COUNT(DISTINCT o.order_id) AS 订单数, -- 地区订单数(去重)
COUNT(DISTINCT u.user_id) AS 用户数, -- 地区消费用户数(去重)
SUM(o.order_amount) AS 总消费金额, -- 地区总消费
-- 客单价:总消费金额/订单数,保留2位小数(客单价=平均每笔订单消费金额)
ROUND(SUM(o.order_amount) / COUNT(DISTINCT o.order_id), 2) AS 客单价
FROM `order` o
JOIN `user` u ON o.user_id = u.user_id
WHERE o.order_status = '已支付'
GROUP BY u.user_region -- 按地区分组
ORDER BY 总消费金额 DESC;
运行结果:
|------|-----|-----|----------|---------|
| 用户地区 | 订单数 | 用户数 | 总消费金额 | 客单价 |
| 北京 | 5 | 2 | 12193.00 | 2438.60 |
| 上海 | 2 | 1 | 5197.00 | 2598.50 |
| 深圳 | 1 | 1 | 1798.00 | 1798.00 |
| 广州 | 1 | 1 | 599.00 | 599.00 |
结果解读:北京地区总消费最高(12193 元),且有 2 个消费用户