从列中减去一个设定的百分比?

时间:2014-06-09 16:25:38

标签: sql postgresql case

我有一个小查询,其中code_price是定价的10%。问题是,有时代码价格与定价相同,所以我在查询中尝试了这个。

SELECT round(st_codeprice(ss.stock_no, 'E', 'stockslc')::numeric, 2) as code_price
       ,(select case when code_price = ss.list_price then ss.list_price - (ss.list_price * .10) else code_price end)

from stockslc ss

st_codeprice是一个从不同数据库中提取codeprice的函数。

它给我的错误是ERROR: column "code_price" does not exist我想知道它是减法是问题还是案例陈述。

作者注意:如果我需要更改标题,请告诉我要将其更改为什么,我对此标题持怀疑态度。

2 个答案:

答案 0 :(得分:2)

问题在于,在执行时,code_price别名是未知的。要解决这个问题,您可以完全取消别名,也可以在主SELECT之外生成别名,并将其作为JOIN(或子选择)的一部分包含在内。

删除别名如下所示:

SELECT round(st_codeprice(ss.stock_no, 'E', 'stockslc')::numeric, 2) as code_price,
(select case when round(st_codeprice(ss.stock_no, 'E', 'stockslc')::numeric, 2) = ss.list_price then ss.list_price - (ss.list_price * .10) else round(st_codeprice(ss.stock_no, 'E', 'stockslc')::numeric, 2) end)
FROM stockslc ss

但这有点难看,每个结果行有3次调用你的函数。

这是你如何使用JOIN:

SELECT 
 CASE 
   WHEN code_price = ss.list_price THEN ss.list_price - (ss.list_price * .10) 
   ELSE code_price 
 END
FROM stockslc ss
INNER JOIN (SELECT ss2.stock_no, round(st_codeprice(ss2.stock_no, 'E', 'stockslc')::numeric, 2) as code_price 
            FROM stockslc ss2) res ON ss.stock_no = res.stock_no

..更干净..

答案 1 :(得分:0)

你有没有试过这样的东西

SELECT 

    case when round(st_codeprice(ss.stock_no, 'E', 'stockslc')::numeric, 2) = ss.list_price 
        then ss.list_price - (ss.list_price * .10) 
        else round(st_codeprice(ss.stock_no, 'E', 'stockslc')::numeric, 2)
    end as code_price

from stockslc ss