SQL库存分配优先逻辑问题处理


场景:计算出SKU当前可用库存的实际库龄
难点:实际情况,当前库存,不会是同一批入库的,不同批次入库

处理方法:

  1. 按照入库记录先进先出逻辑,入库早的先出库;
  2. 取SKU最近入库的记录作为当前库存的入库时间,再分别计算库龄。

当然,其他类似的先进先出,先进后出的分配问题均可用类似的逻辑处理。

 

比如:产品XB000001当前可用库存为217,按照出入库的先进先出逻辑,应该取最近一次入库的时间作为入库时间,不足库存的向上取,直至取完,因此217的库存应该是有165是5/19入库的,52个是4/21入库的。


DROP TABLE IF EXISTS #temp_a,#temp_b,#temp_c,#temp_d

/*
场景:计算出SKU当前可用库存的实际库龄
难点:实际情况,当前库存,不会是同一批入库的,不同批次入库
处理方法:
	1、按照入库记录先进先出逻辑,入库早的先出库;
	2、取SKU最近入库的记录作为当前库存的入库时间,再分别计算库龄。
*/


-- 当前可用库存数
SELECT
	a.当前库存数,
	a.SKU
INTO #temp_a
FROM(
	SELECT 'XB000001' SKU, 217 当前库存数 union all
	SELECT 'XB000002' SKU, 29  当前库存数
) a


-- 入库记录
SELECT
	b.入库数,
	CAST(b.入库时间 AS DATETIME) 入库时间,
	b.SKU
INTO #temp_b
FROM(
	SELECT 'XB000001' SKU, 165 入库数,'2022-05-19 12:00:42' 入库时间 union all
	SELECT 'XB000001' SKU, 100 入库数,'2022-04-21 12:00:37' 入库时间 union all
	SELECT 'XB000001' SKU, 20  入库数,'2022-03-04 18:00:31' 入库时间 union all
	SELECT 'XB000001' SKU, 250 入库数,'2020-05-20 18:41:53' 入库时间 union all
	SELECT 'XB000001' SKU, 50  入库数,'2020-03-24 06:02:15' 入库时间 union all
	SELECT 'XB000002' SKU, 39  入库数,'2022-05-10 12:00:32' 入库时间 union all
	SELECT 'XB000002' SKU, 50  入库数,'2021-03-12 06:01:29' 入库时间  
) b
ORDER BY b.入库时间 DESC

SELECT * FROM #temp_a
SELECT * FROM #temp_b


SELECT
	b.入库数,
	b.入库时间,
	b.SKU,
	a.当前库存数,

	-- 按照入库时间降序,计算每个SKU的累计入库数
	SUM(b.入库数) OVER(PARTITION BY a.SKU ORDER BY b.入库时间 DESC) [累计入库数],	

	-- 按照SKU的入库时间降序排序
	ROW_NUMBER() OVER(PARTITION BY a.SKU ORDER BY b.入库时间 DESC) [rank],	
	CASE
		WHEN a.当前库存数 >= SUM(b.入库数) OVER(PARTITION BY a.SKU ORDER BY b.入库时间 DESC)
		THEN 1
		ELSE 0	
	END [分配库存]
INTO #temp_c
FROM #temp_a a
INNER JOIN #temp_b b ON b.SKU = a.SKU


-- 剔除多余不需要分配的记录
SELECT
	a.入库数,
    a.入库时间,
    a.SKU,
    a.当前库存数,
    a.累计入库数,
    a.rank,
    a.分配库存,
    CASE
		WHEN a.分配库存=1 THEN a.累计入库数
		ELSE 0
	END [累计分配]

INTO #temp_d
FROM #temp_c a
LEFT JOIN(
	SELECT SKU,MIN(rank) rank FROM #temp_c WHERE 分配库存=0 GROUP BY SKU
) b ON b.SKU = a.SKU AND b.rank = a.rank

WHERE a.分配库存 = 1 OR b.rank IS NOT NULL
ORDER BY a.入库时间 DESC


--重新计算分配,计算库龄
SELECT
	a.入库数,
    a.入库时间,
    a.SKU,
    a.当前库存数 当前总库存数,
	CASE
		WHEN a.分配库存=1 THEN a.入库数
		WHEN a.当前库存数 > SUM(a.累计分配) OVER(PARTITION BY a.SKU ORDER BY a.rank ASC) THEN a.当前库存数 - SUM(a.累计分配) OVER(PARTITION BY a.SKU ORDER BY a.rank ASC)
		ELSE 0
	END 当前库存数,
	DATEDIFF(DAY, a.入库时间, GETDATE()) [当前库存-库龄]

FROM #temp_d a

 




评论

支持上传图片(拖动图片或者截图粘贴)

129 评论
nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 20:36:05 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:36:51 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:28:44 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:27:30 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:26:28 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:26:26 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:26:24 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:26:23 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:26:22 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:26:20 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:26:18 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:25:02 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:24:11 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:23:37 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:23:08 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:22:42 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:22:09 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:21:33 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:21:09 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:20:44 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:19:34 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:19:31 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:19:26 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:19:24 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:19:21 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:19:18 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:19:14 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:19:08 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:19:05 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:19:02 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:18:56 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:18:52 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:18:47 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:17:17 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:16:01 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:15:59 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:15:54 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:15:51 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:15:47 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:15:45 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:15:41 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:14:23 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:13:36 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:12:52 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:12:04 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:11:39 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:11:02 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:10:38 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:10:10 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:09:41 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:08:57 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:08:54 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:08:51 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:08:46 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:08:44 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:08:40 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:08:38 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:07:55 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 19:06:44 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:52:57 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:51:29 回复

555

@@1c07nChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:50:22 回复

555

nZkkAbWB'"Chrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:50:15 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:50:09 回复

555

nZkkAbWBka6L39k7'Chrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:47:15 回复

555

-1" OR 5*5=25 -- Chrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:43:46 回复

555

-1' OR 5*5=25 -- Chrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:43:43 回复

555

-1 OR 5*5=25Chrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:43:39 回复

555

-1 OR 5*5=25 -- Chrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:43:36 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:43:33 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:42:15 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:41:10 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:41:08 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:41:06 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:41:04 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:41:02 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:41:01 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:40:59 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:39:54 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:39:20 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:38:54 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:38:27 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:38:02 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:37:42 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:37:17 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:36:55 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:36:32 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:35:43 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:35:40 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:35:39 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:35:38 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:35:36 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:35:35 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:35:34 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:34:58 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:34:17 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:29:42 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:29:04 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:28:14 回复

(select 198766*667891 from DUAL)

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:28:11 回复

(select 198766*667891)

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:28:11 回复

@@kna12

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:28:09 回复

555����%2527%2522\'\"

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:28:08 回复

555'"

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:28:04 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:28:02 回复

555'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:27:19 回复

555*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:26:47 回复

555oh5iSjMg')) OR 96=(SELECT 96 FROM PG_SLEEP(15))--

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:26:18 回复

555qbEM32eg') OR 716=(SELECT 716 FROM PG_SLEEP(15))--

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:25:46 回复

555JCk1uh9C' OR 782=(SELECT 782 FROM PG_SLEEP(15))--

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:25:00 回复

555-1)) OR 255=(SELECT 255 FROM PG_SLEEP(15))--

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:24:35 回复

555-1) OR 960=(SELECT 960 FROM PG_SLEEP(15))--

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:23:48 回复

555-1 OR 489=(SELECT 489 FROM PG_SLEEP(15))--

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:23:28 回复

555ViVRiPCO'

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:23:07 回复

555-1 waitfor delay '0:0:15' --

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:22:48 回复

555-1)

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:22:34 回复

555-1

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:22:19 回复

(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:22:04 回复

5550"XOR(555*if(now()=sysdate(),sleep(15),0))XOR"Z

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:21:44 回复

5550'XOR(555*if(now()=sysdate(),sleep(15),0))XOR'Z

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:21:26 回复

555*if(now()=sysdate(),sleep(15),0)

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:39 回复

-1" OR 5*5=25 or "hLOL8Qxh"="

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:38 回复

-1' OR 5*5=25 or 'FPo5GVx9'='

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:36 回复

-1" OR 5*5=25 --

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:34 回复

-1' OR 5*5=25 --

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:32 回复

-1 OR 5*5=25

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:30 回复

-1 OR 5*5=25 --

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:20:27 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:19:45 回复

555

nZkkAbWBChrome/131.0.0.0Windows NT 10.0; Win64; x64
2026-04-10 18:19:13 回复

555