跳到主要内容

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 |
+-------------+---------+------+

二、思路分析

  1. 分别按SKU计算平均库存 = avg(stock);
  2. 分别按SKU计算日均销量 = sum(qty) / count(distinct sale_date);
  3. 库存周转天数 = 平均库存 / 日均销量;
  4. 使用 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) 保护。

五、知识点总结

考点说明
多表JOINLEFT 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真题

交流微信二维码

你可能还想看