如何舍入新计算的值?

时间:2016-10-21 00:19:17

标签: sql oracle

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的产品?

2 个答案:

答案 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()的想法相同,但它只使用适当的小数位数来存储结果。