SQL条件统计语句编写求助:Plate表库存状态AV无数据时显示0或null
解决AV状态库存统计显示0的问题
你的核心问题是原查询通过WHERE子句提前过滤了AV状态的数据,导致当该状态无库存时,对应的商品行直接从结果中消失。要实现「无AV库存时显示0」的需求,我们需要把状态判断逻辑移到聚合函数内部,而不是提前筛掉行。
修改后的查询语句
SELECT custitemalias.itemalias, custitem.item, custitem.baseuom, SUM( CASE WHEN plate.invstatus = 'AV' AND plate.status != 'P' THEN CASE WHEN plate.quantity < 1 THEN 0 ELSE plate.quantity END ELSE 0 END ) AS total_quantity, plate.facility, 'AV' AS invstatus -- 固定显示我们关注的目标状态 FROM custitem LEFT JOIN plate ON PLATE.ITEM = custitem.item LEFT JOIN CUSTITEMALIAS ON custitem.item = CUSTITEMALIAS.ITEM WHERE custitem.custid = 'CUSTOMER' GROUP BY custitemalias.itemalias, custitem.item, plate.facility, custitem.baseuom, 'AV' -- 分组时固定状态值,避免出现其他状态的行
关键修改点说明
移除
WHERE中的AV状态过滤:
原来的plate.invstatus = 'AV'会直接排除所有非AV状态的行,导致当没有AV库存时,连商品的基本信息都查不出来。去掉这个条件后,所有关联的库存数据都会被纳入计算,但我们只在求和时统计符合要求的AV状态数量。带条件的SUM聚合:
嵌套的CASE语句先判断是否是符合要求的AV状态(且status != 'P'):- 如果是,再检查数量是否小于1,是的话替换为0,否则使用实际数量
- 如果不是AV状态,直接贡献0到求和结果中
这样即使没有AV状态的库存,求和结果也会显示0,而非直接丢失该行。
固定
invstatus为'AV':
因为我们只关心AV状态的统计结果,所以直接在SELECT和GROUP BY中指定固定值'AV',避免分组时出现其他状态的行,同时保证结果集始终显示AV状态的条目。
可选优化:处理完全无库存的情况
如果希望某个商品完全没有任何库存数据时,也能显示出来并显示0,可以用COALESCE函数把求和的NULL结果转为0:
COALESCE( SUM( CASE WHEN plate.invstatus = 'AV' AND plate.status != 'P' THEN CASE WHEN plate.quantity < 1 THEN 0 ELSE plate.quantity END ELSE NULL END ), 0 ) AS total_quantity
内容的提问来源于stack exchange,提问作者Rich
相关产品推荐
相关产品推荐

