技术请求:将InventoryItem表转换为区分在手与待持库存的视图
实现库存分组统计视图的SQL方案
原表数据(InventoryItem表)
| Inventory ID | Warehouse | Warehouse Location | Qty |
|---|---|---|---|
| 11017 | Nashville | Dock | 10 |
| 11017 | Nashville | Hold | 5 |
| 11017 | Nashville | A1 | 13 |
| 11017 | New York | Hold | 20 |
| 11119 | Chicago | Hold | 5 |
| 11119 | New York | C34 | 6 |
| 11119 | New York | Hold | 20 |
目标视图需求
按Inventory ID和Warehouse分组,分别统计两类库存数量:
- 在手库存:
Warehouse Location不等于Hold的数量总和 - 待持库存:
Warehouse Location等于Hold的数量总和
无对应数据时显示0,最终结果如下:
| Inventory ID | Warehouse | Qty on Hand(Not Equal to Hold) | Qty on Hold(Equal to hold) |
|---|---|---|---|
| 11017 | Nashville | 23 | 5 |
| 11017 | New York | 0 | 20 |
| 11119 | Chicago | 0 | 5 |
| 11119 | New York | 6 | 20 |
解决方案:条件聚合SQL语句
使用GROUP BY结合SUM(CASE...)的条件聚合方式,兼容MySQL、SQL Server、PostgreSQL等多数关系型数据库:
CREATE VIEW InventorySummary AS SELECT `Inventory ID`, Warehouse, SUM(CASE WHEN `Warehouse Location` != 'Hold' THEN Qty ELSE 0 END) AS `Qty on Hand(Not Equal to Hold)`, SUM(CASE WHEN `Warehouse Location` = 'Hold' THEN Qty ELSE 0 END) AS `Qty on Hold(Equal to hold)` FROM InventoryItem GROUP BY `Inventory ID`, Warehouse;
逻辑说明
- 分组规则:按
Inventory ID和Warehouse分组,保证每个库存ID在对应仓库的统计独立 - 条件求和:
- 在手库存:通过
CASE判断货位非Hold时取对应数量,否则取0,再求和 - 待持库存:判断货位为
Hold时取对应数量,否则取0,再求和
- 在手库存:通过
- 视图创建:用
CREATE VIEW将查询结果保存为视图,方便后续直接调用
内容的提问来源于stack exchange,提问作者Es12
相关产品推荐
相关产品推荐

