如何用SQL计算商品折扣并筛选折扣大于25的商品,修复1054列不存在报错
报错释义
你拿到的错误提示#1054 - Unknown column 'p_discont' in 'where clause'的中文含义为:#1054 - WHERE子句中不存在名为'p_discont'的列。
问题原因
报错是由两个问题共同导致的:
- 拼写错误:你在
SELECT语句中定义的折扣列别名为p_discount,但WHERE子句里写的是p_discont,少了字母s,本身就无法匹配到对应的列。 - SQL执行顺序限制:SQL语句的执行逻辑为
FROM → WHERE → SELECT → ORDER BY,你在SELECT阶段才定义的别名,在更早执行的WHERE阶段是识别不到的,就算拼写正确也会报同类未知列错误。
修复方案
提供两种可直接使用的写法:
方案1:WHERE中直接重复计算逻辑(性能无额外损耗,日常场景最常用)
SELECT *, (product_price - product_sell_price) / product_sell_price * 100 AS p_discount FROM `products` WHERE product_price IS NOT NULL AND product_sell_price IS NOT NULL -- 新增判空,避免除以0报错 AND (product_price - product_sell_price) / product_sell_price * 100 > 25 ORDER BY p_discount DESC
方案2:用子查询/CTE先计算别名再筛选(逻辑更清晰,复杂计算场景复用性高)
WITH product_discount AS ( SELECT *, (product_price - product_sell_price) / product_sell_price * 100 AS p_discount FROM `products` WHERE product_price IS NOT NULL AND product_sell_price IS NOT NULL ) SELECT * FROM product_discount WHERE p_discount > 25 ORDER BY p_discount DESC
内容的提问来源于stack exchange,提问作者Ram Chander
相关产品推荐
相关产品推荐

