2017-01-18 2 views
0

У меня есть столбец, как показано ниже, и вывод, который я хочу, приведен ниже в этом примере. Col1 - это числовой тип данных.Округление до первой цифры +1 в оракуле

Col1    OutputCol1 
1234 round to 2000 
2300000 round to 3000000 
456789.23 round to 500000 

Всегда первая цифра + 1. Я мог бы использовать круглую функцию с отрицательным значением, но она округляется до нижнего, если второе число меньше 5.

+0

Column Col1's data type? – jarlh

+0

@jarlh: его числовое значение – kten

+0

'(пол (abs (num)/power (10, floor (log (10, abs (num))))) + 1) * (мощность (10, пол (log (10, abs (num))))) 'что-то вроде этого поможет вам. Обработка чисел <1 должна выполняться дополнительно. –

ответ

1

Хорошо. , , Вы можете добавить 1 к первой цифре, а затем площадке с нулями:

select rpad(cast(substr(col1, 1, 1) as int) + 1, 
      log(10, col1), 
      '0' 
      ) 
+0

Genius !!! Просто, что это 'log (10, col1)' –

+0

@MaheswaranRavisankar. , , Спасибо. –

0

Вот несколько способов - один математическая, другая с помощью манипуляции вывода строк из col1 в научной нотации:

WITH sample_data AS (SELECT 1234 col1 FROM dual UNION ALL 
        SELECT 2300000 col1 FROM dual UNION ALL 
        SELECT 456789.23 col1 FROM dual UNION ALL 
        SELECT -183 col1 FROM dual UNION ALL 
        SELECT 1000 col1 FROM dual UNION ALL 
        SELECT 0.392 col1 FROM dual) 
SELECT col1, 
     ceil(col1/order_of_magnitude_of_col1) * order_of_magnitude_of_col1 output1, 
     CEIL(to_number(SUBSTR(sn, 1, 4))) * POWER(10, to_number(SUBSTR(sn, 6))) output2 
FROM (SELECT col1, 
       power(10, floor(LOG(10, abs(col1)))) order_of_magnitude_of_col1, 
       to_char(col1, 'fms0.0EEEE') sn 
     FROM sample_data); 

     COL1 OUTPUT1 OUTPUT2 
---------- ---------- ---------- 
     1234  2000  2000 
    2300000 3000000 3000000 
456789.23  500000  500000 
     -183  -100  -100 
     1000  1000  1000 
    0.392  0.4  0.4 
1

Использовать строчный maipulation. Возьмите первую цифру, добавьте ее, добавьте завершающие нули. В случае, если за цифрой следуют только нули (1000 или 10,00), не добавляйте 1.

select col1, 
    case when nvl(to_number(substr(to_char(col1), 2)),0) = 0 then 
    to_number(rpad(substr(to_char(trunc(col1)), 1, 1), length(to_char(trunc(col1))), '0')) 
    else 
    to_number(rpad(to_char(to_number(substr(to_char(trunc(col1)), 1, 1)) + 1), length(to_char(trunc(col1))), '0')) 
    end as x, 
    to_number(substr(to_char(trunc(col1)), 2)) 
from 
Смежные вопросы