SQL SKU库存周转天数:出库数量/平均库存(SHEIN面试题)
一、题目
SHEIN需要监控每个SKU的库存周转效率。请计算2025年6月每个SKU的库存周转天数。
库存周转天数 = 平均库存 / 日均销量,结果保留1位小数。
假设有两张表:
t3_inventory_snapshot:每日库存快照表t3_daily_sales:每日销量表
-- t3_inventory_snapshot 每日库存快照
+-------------+---------+--------+
| snap_date | sku_id | stock |
+-------------+---------+--------+
| 2025-06-01 | SKU001 | 500 |
| 2025-06-02 | SKU001 | 480 |
| 2025-06-03 | SKU001 | 460 |
| 2025-06-01 | SKU002 | 300 |
| 2025-06-02 | SKU002 | 280 |
| 2025-06-03 | SKU002 | 250 |
+-------------+---------+--------+
-- t3_daily_sales 每日销量表
+-------------+---------+------+
| sale_date | sku_id | qty |
+-------------+---------+------+
| 2025-06-01 | SKU001 | 20 |
| 2025-06-02 | SKU001 | 20 |
| 2025-06-03 | SKU001 | 20 |
| 2025-06-01 | SKU002 | 20 |
| 2025-06-02 | SKU002 | 30 |
| 2025-06-03 | SKU002 | 25 |
+-------------+---------+------+
二、思路分析
- 分别按SKU计算平均库存 = avg(stock);
- 分别按SKU计算日均销量 = sum(qty) / count(distinct sale_date);
- 库存周转天数 = 平均库存 / 日均销量;
- 使用
JOIN或子查询分别聚合再关联。
| 维度 | 评分 |
|---|---|
| 题目难度 | ⭐️⭐️⭐️ |
| 题目清晰度 | ⭐️⭐️⭐️⭐️ |
| 业务常见度 | ⭐️⭐️⭐️⭐️ |
三、逐步推导
1.分别计算平均库存和日均销量
按sku关联两表,计算6月的平均库存和日均销量:
select sku_id,
round(avg(stock), 2) as avg_stock,
round(sum(qty) / count(distinct sale_date), 2) as avg_daily_sales
from (
select i.sku_id, i.stock, s.qty, s.sale_date
from t3_inventory_snapshot i
left join t3_daily_sales s
on i.sku_id = s.sku_id and i.snap_date = s.sale_date
where i.snap_date between '2025-06-01' and '2025-06-30'
) t
group by sku_id
查询结果
+---------+------------+------------------+
| sku_id | avg_stock | avg_daily_sales |
+---------+------------+------------------+
| SKU002 | 276.67 | 25.0 |
| SKU001 | 480.0 | 20.0 |
+---------+------------+------------------+
2 rows selected (0.943 seconds)(https://www.dwsql.com)
2.计算库存周转天数
在子查询基础上计算周转天数,使用nullif防止日均销量为0时除零:
select sku_id,
avg_stock,
avg_daily_sales,
round(avg_stock / nullif(avg_daily_sales, 0), 1) as turnover_days
from (
select sku_id,
round(avg(stock), 2) as avg_stock,
round(sum(qty) / count(distinct sale_date), 2) as avg_daily_sales
from (
select i.sku_id, i.stock, coalesce(s.qty, 0) as qty, s.sale_date
from t3_inventory_snapshot i
left join t3_daily_sales s
on i.sku_id = s.sku_id and i.snap_date = s.sale_date
where i.snap_date between '2025-06-01' and '2025-06-30'
) t
group by sku_id
) tt
查询结果
+---------+------------+------------------+----------------+
| sku_id | avg_stock | avg_daily_sales | turnover_days |
+---------+------------+------------------+----------------+
| SKU002 | 276.67 | 25.0 | 11.1 |
| SKU001 | 480.0 | 20.0 | 24.0 |
+---------+------------+------------------+----------------+
2 rows selected (0.624 seconds)(https://www.dwsql.com)
四、常见坑点
坑1:关联键的选择 — 库存快照表与销量表需要按 sku_id + 日期关联,left join 确保即使某天无销量也能参与平均库存计算。
坑2:日均销量的分母 — 日均销量公式中 count(distinct sale_date) 仅统计有销量的天数,若某天无销量则该天不纳入分母。
坑3:除零保护 — 某SKU日均销量为0时,直接除法会报错,需使用 nullif(avg_daily_sales, 0) 保护。
五、知识点总结
| 考点 | 说明 |
|---|---|
| 多表JOIN | LEFT JOIN保留主表所有数据,COALESCE处理NULL |
| GROUP BY + 聚合函数 | 分组聚合计算平均库存和日均销量 |
| 日期范围筛选 | BETWEEN过滤指定月份的数据 |
| NULL值处理 | nullif防止除零,count(distinct)自动跳过null |
六、建表语句
点击展开 DDL & DML
-- 库存快照表:记录每日各sku的库存数量
create table t3_inventory_snapshot (
snap_date string comment '快照日期',
sku_id string comment 'sku编码',
stock int comment '当日库存量'
) comment '每日库存快照表';
-- 销量表:记录每日各sku的销售数量
create table t3_daily_sales (
sale_date string comment '销售日期',
sku_id string comment 'sku编码',
qty int comment '当日销量'
) comment '每日销量表';
-- 插入库存快照数据
insert into t3_inventory_snapshot(snap_date, sku_id, stock) values
('2025-06-01','SKU001',500),
('2025-06-02','SKU001',480),
('2025-06-03','SKU001',460),
('2025-06-01','SKU002',300),
('2025-06-02','SKU002',280),
('2025-06-03','SKU002',250);
-- 插入销量数据
insert into t3_daily_sales(sale_date, sku_id, qty) values
('2025-06-01','SKU001',20),
('2025-06-02','SKU001',20),
('2025-06-03','SKU001',20),
('2025-06-01','SKU002',20),
('2025-06-02','SKU002',30),
('2025-06-03','SKU002',25);
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
