Разделение значений на единицы, тысячи, миллионы и миллиарды на столбцы в SQL Server - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь разделить значения на единицы, тысячи, миллионы и миллиарды в SQL Server.Значения могут быть отрицательными и положительными, и для значения не установлено количество символов / цифр.Я дошел до этой точки: enter image description here

Так вот мой код:

UPDATE table
SET Units = RIGHT(CONVERT(VARCHAR(50),[Value]), 3)

UPDATE table
SET Thousands = Right(CONVERT(VARCHAR(50),[Value]), 6)

UPDATE table
SET Thousands = SUBSTRING(CONVERT(VARCHAR(50),Thousands), 1, 3)

Но здесь я сталкиваюсь с проблемой, как будто у меня есть номер '1 019 242 ', для Units это работает -> 242, но для тысяч я сначала хочу получить 6 цифр справа: 019242, а затем подстроку первые 3 цифры, но 0 исчезает, поэтому вместо 19 я получаю 192...

Также я не знаю, как это сделать для миллиардов, так как числа могут различаться по размеру, поэтому это может быть '19 105' или '37 594 820 583 '...

Кстати, так я и придумал, но, может быть, есть что-то проще сделать!

Заранее спасибо за помощь!

Мне удалось (СПАСИБО ЗА КОММЕНТАРИИ !, спасибо) добраться до пункта: enter image description here

Теперь я пытаюсь сохранить результаты в моей колонке «Тысячи».Не знаю, как это сделать, я ищу это ..

Еще раз спасибо за вашу помощь!

Ответы [ 5 ]

0 голосов
/ 27 октября 2018

Другой вариант - использовать вычисляемые поля.Эти поля используют без пробела в вашей базе данных, поэтому размер файла не должен быть проблемой.И вы не обязаны устанавливать их или обновлять их.

create table BigVal ( [Value] int,
Billions as abs([Value] / 1000000000 ),
Millions as abs([Value] % 1000000000 / 1000000),
Thousands as abs([Value] % 1000000 / 1000),
Units as abs([Value] % 1000),
[Sign] as case when Value < 0 then -1 else 1 end )

insert into BigVal ( [Value] ) values
(         234 ),
(      123456 ),
(   123456789 ),
(  1234567890 ),
(         -23 ),
( -1234567890 ),
(  2147483647 ),
( -2147483648 )

select * from BigVal  

Результаты:

Value       Billions    Millions    Thousands   Units       Sign
----------- ----------- ----------- ----------- ----------- -----------
234         0           0           0           234         1
123456      0           0           123         456         1
123456789   0           123         456         789         1
1234567890  1           234         567         890         1
-23         0           0           0           23          -1
-1234567890 1           234         567         890         -1
2147483647  2           147         483         647         1
-2147483648 2           147         483         648         -1
0 голосов
/ 24 октября 2018

СПАСИБО ВСЕМ !!

Таким образом, запросы, упомянутые выше в комментариях, работают для меня, и если размер базы данных недостаточен, увеличьте его (файл журнала), и он будет работать.

0 голосов
/ 24 октября 2018

Сочетание целочисленной математики и мода должно дать вам желаемое

SELECT  A.Value,
        ABS(A.Value) / 1000000000 AS Billions,
        ABS(A.Value) % 1000000000 / 1000000 AS Millions,
        ABS(A.Value) % 1000000 / 1000 AS Thousands,
        ABS(A.Value) % 1000 AS Units,
        CASE WHEN A.Value < 0 THEN -1 ELSE 1 END AS New_Col
FROM    (
            VALUES (CAST(3070192242 AS BIGINT)),(-370192242)
        ) AS A(Value);

% (модуль) (Transact-SQL)

ABS(Transact-SQL)

Если целочисленный дивиденд делится на целочисленный делитель, результатом является целое число, у которого усечена любая дробная часть результата.

Редактировать:

Обновить заявление:

UPDATE  A
SET     Billions = ABS(A.Value) / 1000000000,
        Millions = ABS(A.Value) % 1000000000 / 1000000,
        Thousands = ABS(A.Value) % 1000000 / 1000,
        Units = ABS(A.Value) % 1000,
        New_Col = CASE WHEN A.Value < 0 THEN -1 ELSE 1 END AS New_Col
FROM    dbo.YourTable AS A;
0 голосов
/ 24 октября 2018

Пожалуйста, попробуйте это:

update [table] set
     [units]        =   abs([value] % 1000) 
    ,[thousands]    =   abs([value] % 1000000 / 1000)
    ,[millions]     =   abs([value] % 1000000000 / 1000000) 
    ,[billions]     =   abs([value] % 1000000000000 / 1000000000)   
    ,[new_col]          =   sign([value])

И, если у вас есть проблемы с ростом файла журнала, попробуйте циклический подход, он использует меньше пространства журнала:

while exists (select null from [table] where [units] is null)
begin
    update top(1) percent [table] set
         [units]        =   abs([value] % 1000) 
        ,[thousands]    =   abs([value] % 1000000 / 1000)
        ,[millions]     =   abs([value] % 1000000000 / 1000000) 
        ,[billions]     =   abs([value] % 1000000000000 / 1000000000)   
        ,[sign]         =   sign([value])
    where [units] is null

end;
0 голосов
/ 24 октября 2018

Заполните его пробелом перед (слева) после преобразования в строку.

Всегда тысяча LEFT ( RIGHT ( VALUE , 6) , 3)

thousands   = left(right(space(10) + convert(varchar(100), [value]), 6), 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...