查询昨日在LOST位置今日转移的库存的SQL语句问题求助
问题分析与解决方案
你的原查询逻辑存在矛盾:要求同一条记录的InventoryDate同时等于昨天和今天,这显然不可能,所以返回空结果。要实现需求,需要关联同一库存的昨日和今日两条记录,判断它们的位置变化。
假设你的表中有唯一标识单个库存的字段(比如InventoryID),以下是两种可行的写法:
方法1:自连接查询
通过将表自身连接,匹配同一库存的昨日和今日记录:
SELECT t1.InventoryID, t1.LocationName AS 昨日位置, t2.LocationName AS 今日位置, t1.InventoryDate AS 昨日日期, t2.InventoryDate AS 今日日期 FROM InventoryByDate t1 INNER JOIN InventoryByDate t2 ON t1.InventoryID = t2.InventoryID WHERE -- 昨日库存处于LOST位置 t1.InventoryDate = DATEADD(day, DATEDIFF(day, 0, GETDATE()), -1) AND t1.LocationName = 'LOST' -- 今日库存不在LOST位置 AND t2.InventoryDate = DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) AND t2.LocationName != 'LOST';
方法2:EXISTS子查询
通过子查询验证同一库存昨日是否处于LOST位置:
SELECT * FROM InventoryByDate t WHERE -- 筛选今日非LOST的库存 t.InventoryDate = DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) AND t.LocationName != 'LOST' -- 验证该库存昨日处于LOST位置 AND EXISTS ( SELECT 1 FROM InventoryByDate t_prev WHERE t_prev.InventoryID = t.InventoryID AND t_prev.InventoryDate = DATEADD(day, DATEDIFF(day, 0, GETDATE()), -1) AND t_prev.LocationName = 'LOST' );
注意事项
如果表中没有InventoryID这类唯一标识,需要用商品编号+批次号等组合字段来关联同一库存的不同日期记录,确保匹配的是同一个库存的前后两日数据。
内容的提问来源于stack exchange,提问作者Logan Simons
相关产品推荐
相关产品推荐

