SELECT product_c, description, cost,
CASE WHEN product_no < 9 THEN cost * 1.10
WHEN product_no BETWEEN 10 AND 15 THEN cost * 1.20
WHEN product_no BETWEEN 15 AND 20 THEN cost * 1.25
WHEN product_no > 20 THEN cost * 1.30
END AS "New Cost"
FROM table
WHERE "New Cost" > 19
我不知道放置ROUND()
的位置,以便它可以绕过我的&#34;新费用&#34;列最接近百或2的十进制,如100.53。
如何使用别名列来排序大于19的产品?
答案 0 :(得分:1)
你问两个问题。标题中的那个很简单:
SELECT ..., cost,
round ( CASE WHEN .....
....END, 2) as "New Cost" ....
也就是说,round()
函数的格式为round(expr, 2)
(如果要舍入到两位小数),expr
是整个CASE
表达式 - 所有它,从单词CASE
开始一直到包括单词END
。
对于任何函数和任何表达式,这都是完全相同的 - 表达式尤其可以是CASE
表达式,并且它(所有它)可以转到任何其他表达式(如文字或文字)专栏名称)可以去。
你问的另一个问题的答案是“你做不到”。
您希望通过SELECT子句中的计算定义“新建成本”,并且希望在WHERE子句中按“新建成本”进行过滤。这不是SELECT语句的处理方式。
在SELECT语句中,首先标识表,视图等(行源)。接下来应用连接/连接条件和WHERE条件。仅在此之后(在应用WHERE条件之后),如果没有GROUP BY,则处理是否转到SELECT子句。您在第一次在SELECT子句中定义的内容不能在WHERE中使用(或者在HAVING中,如果您有GROUP BY子句)。如果要使用数据库,理解SQL语句不同部分的处理顺序非常重要。
要解决您的问题,您需要将所有内容放在子查询中;然后在外部查询中,选择任何 WHERE "New Cost" > 19
。
顺便说一下,很少需要使用引用的列名。养成使用new_cost(或New_Cost或NEW_COST)等名称的习惯 - 没有双引号,Oracle不关心,它会将它们保存在所有大写字母中,但你可以用你喜欢的任何大小写来引用它们。我假设你没有一个名为table
的表。
这样的事情应该有效:
SELECT product_c, description, cost, new_cost
FROM ( SELECT product_c, description, cost,
ROUND( CASE WHEN product_no < 9 THEN cost * 1.10
WHEN product_no BETWEEN 10 AND 15 THEN cost * 1.20
WHEN product_no BETWEEN 15 AND 20 THEN cost * 1.25
WHEN product_no > 20 THEN cost * 1.30
END , 2 ) AS new_cost
FROM table_A
)
WHERE new_cost > 19
;
答案 1 :(得分:0)
将整个case
放入函数调用中。我会改用cast()
:
SELECT product_c, description, cost,
CAST((CASE WHEN product_no < 9 THEN cost * 1.10
WHEN product_no BETWEEN 10 AND 15 THEN cost * 1.20
WHEN product_no BETWEEN 15 AND 20 THEN cost * 1.25
WHEN product_no > 20 THEN cost * 1.30
END) as DECIMAL(10, 2)) AS "New Cost"
FROM table
WHERE "New Cost" > 19
这与round()
的想法相同,但它只使用适当的小数位数来存储结果。