SQL查询如何按SKU横向展示WarehouseA、B仓库对应库存
问题根因
你写的查询无法得到预期结果,存在3个明显逻辑错误:
- 分组维度错误:将
b.WarehouseDescription加入GROUP BY后,同一SKU不同仓库的记录会被拆分为独立行,自然无法实现单SKU单行展示两仓库存的效果。 - 过滤条件矛盾:
HAVING子句中同时要求b.WarehouseDescription = 'WarehouseA'和b.WarehouseDescription = 'WarehouseB',单条记录的仓库名称不可能同时匹配两个值,该条件永远不成立,实际执行会返回空结果。 - 过滤位置错误:
a.Quantity <> 0是行级过滤条件,应该放在WHERE子句中提前筛选数据,放在HAVING里会在全量分组后再过滤,浪费计算性能。
修正后的查询
用条件聚合做行转列即可实现需求,写法兼容绝大多数关系型数据库:
SELECT a.ItemID AS SKU, SUM(CASE WHEN b.WarehouseDescription = 'WarehouseA' THEN a.Quantity ELSE 0 END) AS [Inventory in WarehouseA], SUM(CASE WHEN b.WarehouseDescription = 'WarehouseB' THEN a.Quantity ELSE 0 END) AS [Inventory in WarehouseB] FROM dbo.a INNER JOIN dbo.b ON a.WarehouseID = b.WarehouseID WHERE a.Quantity <> 0 AND b.WarehouseDescription IN ('WarehouseA', 'WarehouseB') GROUP BY a.ItemID ORDER BY a.ItemID
逻辑说明
- 仅保留
a.ItemID作为分组维度,保证每个SKU只输出一行记录 - 通过
CASE表达式在聚合时分别统计两个仓库的库存,独立生成两列库存数据 - 所有行级过滤条件前置到
WHERE阶段,减少分组计算的数据量,查询效率更高 - 如果需要SKU在某仓无库存时显示空值,删掉对应
CASE语句里的ELSE 0即可
补充:如果你用的是SQL Server,也可以用
PIVOT语法实现相同效果,但条件聚合的写法不需要适配数据库专属语法,跨库迁移时不需要修改。
内容的提问来源于stack exchange,提问作者user18755209
相关产品推荐
相关产品推荐

