Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
MSSQLuserK1 Member Откуда: Сообщений: 14 |
Всем доброго времени суток! Обращаюсь к Вам за помощью. есть такие входные данные в mssql: SELECT CONVERT(DECIMAL(10,3), 53.5)результат 53.500 Это все делается convert-ом в varchar чтобы не обрезались 0, нужны числа именно до тысячных. Как средствами sql можно вывести эти данные в формате: "пятьдесят три целых пятьсот тысячных"? Особенность еще в том, что все будет делаться внутри другого select из которого также выводятся другие данные. Заранее спасибо! |
28 янв 17, 16:55 [20156902] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
http://morpher.ru/Products/DLL/SQLServer.aspx |
28 янв 17, 17:56 [20157062] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Ога. Написать "все варианты" для числительных - хватит таблички в "тыщу строк" и инлайн-функции. |
||
28 янв 17, 18:32 [20157148] Ответить | Цитировать Сообщить модератору |
Александра77 Member Откуда: Сообщений: 12 |
на делфи/VBA... есть десятки функций, преобразования цифры в строку ;) Выгрузку же все равно будете в чём то делать, вот это и заставить трудиться! А MSSQL тут не причём. По моему скромному мнению ;) |
28 янв 17, 18:56 [20157198] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
|
||
28 янв 17, 20:01 [20157349] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
|
||
28 янв 17, 21:08 [20157469] Ответить | Цитировать Сообщить модератору |
MSSQLuserK1 Member Откуда: Сообщений: 14 |
Один из вариантов в Delphi, FloatToText - но выводит только до "сотых" И так как не факт что позже БД будет взаимодействовать с утилитой на Delphi, то логично сделать это (или попробовать сделать в sql) Как то ограничить, возможных вариантов "списка всех цифр". |
29 янв 17, 08:51 [20158135] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
declare @num table(num int primary key, spell nvarchar(128)) insert @num values -- 0 - 99 (0, N'ноль'), (1, N'один'), (2, N'два'), (11, N'одинадцать'), (20, N'двадцать'), (99, N'девяносто девять'), -- 100 - 900 (100, N'сто'), (200, N'двести'), (900, N'девятьсот'), -- 1 000 - 1 000 000 (1000, N'одна тысяча'), (7000, N'семь тысяч'), (900000, N'девятьсот тысяч') -- далее ужо сами. Если хорошо подумать - далее все то же самое. Можно сэкономить. declare @numParts table(n int primary key, num int) insert @numParts values (1, 100), (2, 1000), (3, 1000000); declare @n int = 7211; with p as (select @n%num as p, nnum = @n%num, n = 1 from @numParts where n = 1 union all select (@n - p.nnum)%np.num as p, nnum = @n%num, n = np.n from p inner join @numParts as np on np.n = p.n + 1 ) select * from p; with p as (select @n%num as p, nnum = @n%num, n = 1 from @numParts where n = 1 union all select (@n - p.nnum)%np.num as p, nnum = @n%num, n = np.n from p inner join @numParts as np on np.n = p.n + 1 ) select n.spell from p inner join @num as n on p.p = n.num and p <> 0 order by p.n desc |
||||
29 янв 17, 11:28 [20158234] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
aleks2, А падеж и род? А дробная часть? Не устанешь таблицу заполнять? |
29 янв 17, 12:18 [20158308] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Родов всего 3. Падежей не помню, но помню что не более 10. Оценка сверху: 3x10x10000 = 300000 Не, ничего сложного в заполнении таблички не предвидится. ЗЫ. Конечно, цитируемая DLL - это вершина искуcственного интеллекта, познавшая глубины русского языка. |
||
29 янв 17, 15:33 [20158619] Ответить | Цитировать Сообщить модератору |
MSSQLuserK1 Member Откуда: Сообщений: 14 |
Morpher платный, да и сторонние dll не хочется подкидывать, так как факт их безопасности не установлен.( |
30 янв 17, 11:04 [20160508] Ответить | Цитировать Сообщить модератору |
MaxusPerfectus Member Откуда: Москва Сообщений: 11 |
Через скалярную функцию.
Пример: select t1.num, dbo.fn_NumberToCursive_Decimal(t1.num) from ( select 4517121121289.454 num union select 451712112128349.5454054540489001 num union select 4514070 num union select 551381.001 num union select 751062.454 num union select 45174583.4 num union select 153020.78564 num union select 4531002735.45 num union select 7981912.1 num ) t1 |
|
30 янв 17, 17:35 [20163050] Ответить | Цитировать Сообщить модератору |
Mairos Member Откуда: Сообщений: 555 |
MaxusPerfectus, здорово. Пока только один косяк нашёл - пропускает значимые нули между цифрами в дробной части-- Пример вызова select t1.num, dbo.fn_NumberToCursive_Decimal(t1.num) from ( select 62.405 num ) t1 Результат "шестьдесят два целых и сорок пять тысячных" |
31 янв 17, 14:05 [20166091] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3990 |
всех! ![]() |
||||
31 янв 17, 18:08 [20167242] Ответить | Цитировать Сообщить модератору |
MSSQLuserK1 Member Откуда: Сообщений: 14 |
Всем спасибо!) Пока вопрос временно снялся) |
6 фев 17, 17:48 [20185891] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
Евгенич Member Откуда: Сообщений: 269 |
Не нашли почему? |
||
12 авг 19, 09:15 [21946796] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
declare @fractionalPartOfNumber bigint = cast(replace(cast(cast(@num % 1 * 1000000000000000 as bigint) as varchar(100)), '0', '') as bigint) не? |
||||
12 авг 19, 09:22 [21946804] Ответить | Цитировать Сообщить модератору |
Евгенич Member Откуда: Сообщений: 269 |
Как поправить? |
||||
13 авг 19, 12:55 [21947991] Ответить | Цитировать Сообщить модератору |
Gator Member Откуда: Москва Сообщений: 14980 |
Клопов подавить трудно? Вот потом маяться с падежами придётся. |
13 авг 19, 13:06 [21948010] Ответить | Цитировать Сообщить модератору |
Евгенич Member Откуда: Сообщений: 269 |
Сделал так: @fractionalPartOfNumber bigint = cast(replace(rtrim(replace(cast(cast(@num % 1 * 1000000000000000 as bigint) as varchar(100)), '0', ' ')),' ','0') as bigint) |
||||
13 авг 19, 13:31 [21948051] Ответить | Цитировать Сообщить модератору |
Khrupchik Eugeny Member Откуда: Сообщений: 37 |
Евгенич,SELECT n [ЧислоПрописью] from (SELECT n1000.n + n100.n + case when n10.n = ' десять' and n1.n != '' then case n1.n when ' два' then ' две' when ' четыре' then ' четыр' else n1.n end + 'надцать' else n10.n + n1.n END [n] ,n1.c + n10.c + n100.c + n1000.c [c] FROM (VALUES('',0),(' сто',100),(' двести',200),(' триста',300),(' четыреста',400),(' пятьсот',500),(' шестьсот',600),(' семьсот',700),(' восемьсот',800),(' девятьсот',900)) n100(n,c), (VALUES('',0),(' один',1),(' два',2),(' три',3),(' четыре',4),(' пять',5),(' шесть',6),(' семь',7),(' восемь',8),(' девять',9)) n1(n,c), (VALUES('',0),(' десять',10),(' двадцать',20),(' тридцать',30),(' сорок',40),(' пятьдесят',50),(' шестьдесят',60),(' семьдесят',70),(' восемьдесят',80),(' девяносто',90)) n10(n,c), (VALUES('',0),(' одна тысяча',1000),(' две тысячи',2000),(' три тысячи',3000),(' четыре тысячи',4000),(' пять тысяч',5000),(' шесть тысяч',6000),(' семь тысяч',7000),(' восемь тысяч',8000),(' девять тысяч',9000)) n1000(n,c) ) a WHERE c = 5234 --сюда написать число которое надо прописью |
22 авг 19, 14:51 [21955577] Ответить | Цитировать Сообщить модератору |
komrad Member Откуда: Сообщений: 5516 |
Khrupchik Eugeny,
WHERE c = 15
|
||
22 авг 19, 16:10 [21955680] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |