Форматирование результата числового запроса SQL с произвольным количеством десятичных знаков - PullRequest
2 голосов
/ 17 марта 2009

У меня есть таблица базы данных с этими двумя столбцами:

  • Сумма: числовая (18,0)
  • Десятичные знаки: числовые (18,0)

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

  • 1290, 2 (это £ 12,90, должно отображаться как «12,90»)
  • 3400, 0 (это 3400 японских иен, должно отображаться как «3400»)

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

Ответы [ 6 ]

3 голосов
/ 17 марта 2009

Ваша проблема в том, что не существует простого способа сделать это для 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 и Andrew, не будут работать в запросе Oracle, потому что Oracle SQL использует LENGTH (), а не LEN (). И Oracle использует to_char (), а не Cast ().

1 голос
/ 17 марта 2009

На сервере SQL вы можете:

select stuff(convert(varchar,amount) ,
         len(convert(varchar,amount)) - DecimalPlaces - 1, 0, ".")
1 голос
/ 17 марта 2009

Это брутто, но работает для текущих входных данных на сервере 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
1 голос
/ 17 марта 2009

Как насчет?

выберите количество 12345, 2 десятичных знака, substr (to_char (12345), 1, длина (to_char (12345)) - 2) || '' || substr (to_char (12345), -2) результат двойного /

     amount decimalPlaces result
 ---------- ------------- ------
     12345              2 123.45
0 голосов
/ 17 марта 2009

Ответ Мартларка на 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
0 голосов
/ 17 марта 2009

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

select Amount/power(10, DecimalPlaces) from MyTable

Но это не совсем то, что я хочу:

  • Oracle : конечные нули удаляются, поэтому 15,00 долл. США выглядит как «15», а не «15,00»
  • SQL Server : добавлено множество дополнительных конечных нулей, поэтому $ 23,99 выглядит как «23,99000000000» вместо «23,99»
...