Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何对新计算的值进行四舍五入? 选择产品、说明、成本、, 如果产品编号20时,则成本为*1.30 以“新成本”结束 从桌子上 其中“新成本”>19_Sql_Oracle - Fatal编程技术网

Sql 如何对新计算的值进行四舍五入? 选择产品、说明、成本、, 如果产品编号20时,则成本为*1.30 以“新成本”结束 从桌子上 其中“新成本”>19

Sql 如何对新计算的值进行四舍五入? 选择产品、说明、成本、, 如果产品编号20时,则成本为*1.30 以“新成本”结束 从桌子上 其中“新成本”>19,sql,oracle,Sql,Oracle,我不知道将ROUND()放在哪里,这样它就可以将我的“新成本”列四舍五入到最接近的100或2位小数,比如100.53。 如何使用alias列对大于19的产品进行排序 将整个案例放在函数调用中。我将使用cast(): 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

我不知道将
ROUND()
放在哪里,这样它就可以将我的“新成本”列四舍五入到最接近的100或2位小数,比如100.53。
如何使用alias列对大于19的产品进行排序

将整个
案例
放在函数调用中。我将使用
cast()

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
选择产品、说明、成本、,
铸造(如果产品编号<9,则成本为*1.10
如果产品编号介于10和15之间,则成本为*1.20
当产品编号介于15和20之间时,则成本为*1.25
当产品编号>20时,则成本为*1.30
结束)作为小数(10,2))作为“新成本”
从桌子上
其中“新成本”>19

这与
round()
的想法相同,但它仅使用适当的小数位数来存储结果。

您提出了两个问题。标题中的一个很简单:

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()
函数的形式是
round(expr,2)
(如果您想将其四舍五入到小数点后两位),而
expr
是您的整个
CASE
表达式-所有表达式,从单词
CASE
开始,一直到单词
END

这对于任何函数和任何表达式都是完全相同的-表达式可以是一个
大小写
表达式,并且它(全部)可以放在任何其他表达式(如文字或列名)可以放的地方

你问的另一个问题的答案是“你不能那样做”

您希望通过SELECT子句中的计算定义“新成本”,并希望在WHERE子句中按“新成本”进行过滤。这不是SELECT语句的处理方式

在SELECT语句中,首先标识表、视图等(行源)。连接/连接条件以及下一步应用条件的位置。只有在此之后(在应用WHERE条件之后),如果没有GROUP BY,处理才会转到SELECT子句。第一次在SELECT子句中定义的内容不能用于WHERE(或HAVING,如果有GROUPBY子句)。如果要使用数据库,了解SQL语句不同部分的处理顺序尤为重要

要解决您的问题,您需要将所有内容都放在子查询中;然后在外部查询中,选择“新成本”>19
中的任何内容

顺便说一下,很少需要使用带引号的列名。养成使用new_cost(或new_cost或new_cost)等名称的习惯。如果没有双引号,Oracle不会在意,它会将它们保存在所有大写字母中,但您可以在任何大写字母中引用它们。我假设您没有一个名为
table
的表

像这样的方法应该会奏效:

SELECT ..., cost,
    round ( CASE WHEN .....
            ....END, 2) as "New Cost" ....
选择产品、说明、成本、新成本
从(选择产品、说明、成本、,
四舍五入(如果产品编号<9,则成本为*1.10
如果产品编号介于10和15之间,则成本为*1.20
当产品编号介于15和20之间时,则成本为*1.25
当产品编号>20时,则成本为*1.30
结束,2)作为新成本
来自表A
)
其中新的成本>19
;

我不明白。简单地使用
轮(…,2)
有什么缺点?OP没有提到存储,但即使这样,一个四舍五入的数字只有两位小数,如果它存储为数字,那么只有足够的存储空间用于两位小数。@mathguy
round()
对值进行舍入,但不会更改基础数据类型。许多查询应用程序仍然会显示任意数量的小数点。我明白了-因此好处不在于严格遵守Oracle及其SQL,而在于数据与应用程序交换。这是有道理的。
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
;