如何在双货币场景下查询最低价格对应的产品型号与厂商?
解决统一货币后查询最低价格对应信息的问题
表结构
CREATE TABLE Produs ( model NUMBER NOT NULL, fabricant VARCHAR2(30) NOT NULL, categorie VARCHAR2(30) NOT NULL, pret NUMBER NOT NULL, moneda VARCHAR2(3) NOT NULL -- 补充你提到的货币字段,原建表语句未包含 );
需求说明
将所有产品价格统一转换为RON(EUR按汇率5换算),查询转换后价格最低的产品对应的model(型号)和fabricant(厂商)信息。
原SQL的问题
你写的SQL逻辑存在明显错误:
子查询中的WHERE pret=(CASE ...)条件完全不符合需求,只会筛选出价格等于自身(RON)或价格恰好等于原价格5倍(几乎不存在的情况)的数据,导致MIN(pret)取值异常,外层WHERE pret < ...自然会返回大量无关数据。
正确的SQL写法
方法1:使用窗口函数(推荐,Oracle 12c及以上版本支持)
SELECT model, fabricant FROM ( SELECT model, fabricant, -- 计算转换为RON后的价格 CASE WHEN moneda = 'EUR' THEN pret * 5 ELSE pret END AS pret_ron, -- 按转换后价格升序排名,最低价格排第1 RANK() OVER (ORDER BY CASE WHEN moneda = 'EUR' THEN pret * 5 ELSE pret END ASC) AS price_rank FROM Produs ) t WHERE price_rank = 1;
说明:RANK()会保留并列结果,如果有多个产品转换后价格相同且为最低值,会全部返回;若只需返回任意一个最低价格的产品,可改用ROW_NUMBER()。
方法2:子查询获取最低转换价后关联匹配
SELECT model, fabricant FROM Produs WHERE (CASE WHEN moneda = 'EUR' THEN pret * 5 ELSE pret END) = ( SELECT MIN(CASE WHEN moneda = 'EUR' THEN pret * 5 ELSE pret END) FROM Produs );
说明:先计算所有产品转换为RON后的最低价格,再筛选出转换后价格等于该最低值的产品。
内容的提问来源于stack exchange,提问作者Alex Catruc
相关产品推荐
相关产品推荐

