为单列设置不同筛选条件的SQL查询需求
问题需求
现有基于IM_WH与CI_Item两张表的SELECT查询,原本筛选WarehouseCode='002'的所有数据,但需要将**QuantityOnPurchaseOrder(对应IM_WH.PO字段)**替换为WarehouseCode='009'对应的值,其余字段仍保留002仓库的筛选结果。此前尝试使用CASE语句未成功,因为需要直接输出实际字段值。
数据示例:
| ItemCode | OnHand | QTYPO | WarehouseCode |
|---|---|---|---|
| WPF01-CC102-FROST | 10 | 0 | 002 |
| WPF01-CC102-FROST | 0 | 1000 | 009 |
| WPF01-CC102-GREEN | 9 | 0 | 002 |
期望输出:
| ItemCode | OnHand | QTYPO | WarehouseCode |
|---|---|---|---|
| WPF01-CC102-FROST | 10 | 1000 | 002 |
| WPF01-CC102-GREEN | 9 | 0 | 002 |
原查询语句:
SELECT TOP (100) PERCENT dbo.IM_WH.IC, dbo.IM_WH.OnHand, dbo.IM_WH.SO, dbo.IM_WH.PO, dbo.IM_WH.RP, dbo.IM_WH.MIN, dbo.IM_WH.PHYD FROM dbo.IM_WH INNER JOIN dbo.CI_Item ON dbo.IM_WH.IC = dbo.CI_Item.IC WHERE (dbo.IM_WH.WarehouseCode = '002') AND (dbo.IM_WH.RP = 'R') AND (dbo.IM_WH.IC LIKE 'WPF%') ORDER BY dbo.IM_WH.IC
解决方案
可以通过自连接IM_WH表实现需求:主查询保留002仓库的所有筛选条件,同时左连接到009仓库的同表数据,通过COALESCE函数优先取009仓库的PO值,若商品在009仓库无记录,则使用002仓库的原PO值。
修改后的SQL语句如下:
SELECT TOP (100) PERCENT wh002.IC, wh002.OnHand, wh002.SO, COALESCE(wh009.PO, wh002.PO) AS PO, -- 优先取009仓库的PO值,无则用002的 wh002.RP, wh002.MIN, wh002.PHYD FROM dbo.IM_WH wh002 INNER JOIN dbo.CI_Item ON wh002.IC = dbo.CI_Item.IC LEFT JOIN dbo.IM_WH wh009 ON wh002.IC = wh009.IC AND wh009.WarehouseCode = '009' -- 关联009仓库的同商品记录 WHERE wh002.WarehouseCode = '002' AND wh002.RP = 'R' AND wh002.IC LIKE 'WPF%' ORDER BY wh002.IC
逻辑说明
- 用别名
wh002指代002仓库的主数据,保留原查询的所有筛选条件; - 用
LEFT JOIN关联别名wh009的009仓库数据,确保即使商品在009仓库无记录,主查询结果也不会被过滤; COALESCE(wh009.PO, wh002.PO)会先取wh009.PO的值,若该值为NULL(即009仓库无对应商品),则回退到wh002.PO的原数值,完全匹配需求。
内容的提问来源于stack exchange,提问作者jarett
相关产品推荐
相关产品推荐

