2009-03-16 2 views
1

У меня есть таблица базы данных с этими двумя столбцами:Форматирование числовой результат запроса SQL с произвольным числом знаков после запятой

  • Количество: числовой (18,0)
  • DecimalPlaces: цифровой (18,0)

В этой таблице могут храниться суммы в разных валютах, с десятичной точкой, удаленной из суммы (я не могу изменить эту модель данных). Например, там может быть две строки, как это:

  • 1290, 2 (Это £ 12.90, должно появиться как "12.90")
  • 3400, 0 (Это 3400 японская иена, должно появиться as "3400")

Мне нужен SQL-запрос для Oracle и SQL Server, который будет форматировать каждую сумму с правильным количеством десятичных знаков, сохраняя любые конечные нули, как показано выше. Я не могу использовать хранимые процедуры, инструмент отчетности или Excel.

+0

Том H. фактически привел меня путь к праведности с его советами, что форматирование лучше всего оставить на клиенте. Поэтому я решил решить эту проблему, реорганизовывая клиента, чтобы это произошло. Это сделало механизм запросов более сложным, но не так сильно, как использование больших запросов, связанных с db. –

+0

Ничего себе, 10 тыс. Просмотров и нулевых очков - наверняка есть значок для этого - может быть, «классно разочаровывающий вопрос»? :-) –

ответ

0

Лучшее, что я смог придумать до сих пор:

select Amount/power(10, DecimalPlaces) from MyTable 

Но это не делает именно то, что я хочу:

  • Oracle: задние нули , поэтому 15 долл. США выглядят как «15», а не «15,00»
  • SQL Server: добавлено множество дополнительных конечных нулей, поэтому $ 23.99 выглядит как «23.99000000000» вместо от "23.99"
+0

Я нашел, что если я использую это: convert (varchar, cast (Amount/Power (10, DecimalPlaces) как деньги), 2) ... тогда я получаю четыре десятичных знака вместо 11, что выглядит лучше. –

+1

Форматирование действительно лучше для обработки переднего конца. –

+0

Согласовано, но в моем случае передняя часть не знает числа десятичных знаков для каждой строки и поэтому не может выполнить необходимое форматирование. –

1

Как насчет?

select 12345 количество, 2 decimalПлощати, substr (to_char (12345), 1, length (to_char (12345)) - 2) || '' || зиЬзЬг (to_char (12345), -2) в результате двойного /

 amount decimalPlaces result 
---------- ------------- ------ 
    12345    2 123.45 
+0

Спасибо за эту идею. К сожалению, он оставляет хвост "." if decimalPlaces = 0, но это легко фиксируется заменой '.' в выражении с substr ('.', 2 - decimalplaces). –

0

ответ Martlark для Oracle привела меня к этому решению для SQL Server:

select 
    left(cast(Amount as varchar), len(cast(Amount as varchar)) - DecimalPlaces) + 
    left('.', DecimalPlaces) + 
    right(cast(OriginalCurrencyAmount as varchar), DecimalPlaces 
) as FormattedAmount 
from MyTable 
1

Это Брутто, но работал на ток входов на SQL-сервере.

select 
    substring(
    CAST(
     CAST(
     (amount * power(-0.100000000000000000,decimalPlaces*1.000000000000000000)) as numeric(36,18) 
    )as varchar(30) 
    ) 
    ,1,len(cast(amount as varchar(20))) + (CASE WHEN decimalPlaces = 0 THEN 0 ELSE 1 END)) 

from 
myTable 
+0

Я не получаю завершающие нули в окне результатов. –

+0

И это проблема с этим подходом: строка, содержащая (1200, 2), будет отображаться как «12» вместо «12.00». –

+0

Я вижу. Я буду продолжать попытки, но это может помочь другим, если вы добавите это в свои данные примера. –

2

Ваша проблема заключается в том, что для SQLServer и Oracle в одном запросе нет простого способа сделать это.

Правильный способ сделать это для SQLServer является использование STR:

Select STR(Amount, 18, DecimalPlaces) from myTable; 

Правильный способ сделать это для Oracle использует to_char:

SELECT to_char (amount, '99999999999999.'||rpad('',DecimalPlaces, '0')) 
from MyTable; 

запросов, представленных JMS и Эндрю не будет работать в Oracle-запросе, потому что Oracle SQL использует LENGTH(), а не LEN(). И Oracle использует to_char() not Cast().

1

В SQL сервере вы можете:

select stuff(convert(varchar,amount) , 
     len(convert(varchar,amount)) - DecimalPlaces - 1, 0, ".")