You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:30:54