在SQL Server中将值拆分为单位,千位,百万和十亿

时间:2018-10-24 07:56:37

标签: sql sql-server ssms

我正在尝试在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”,对于它可以工作的单位-> 242,但是对于成千上万的人,我首先想从右边得到6位数字:019242,然后首先是子字符串3位数字,但是0消失了,所以我得到192 ...而不是19 ...

我也不知道该怎么做,因为数字的大小可能会有所不同,所以它可能是'19 105'或'37 594 820 583'...

顺便说一句,这只是我想出的方式,但是也许有一些更容易做的事情!

谢谢您的帮助!

我设法(感谢您的评论!)到达了重点: enter image description here

现在,我正在尝试将结果保存到“数千”列中。不确定如何执行,我正在查找。

再次感谢您的帮助!

5 个答案:

答案 0 :(得分:4)

整数数学和mod的混合应该可以得到想要的东西

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);

% (Modulus) (Transact-SQL)

ABS (Transact-SQL)

If an integer dividend is divided by an integer divisor, the result is an integer that has any fractional part of the result truncated.

编辑:

更新声明:

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;

答案 1 :(得分:2)

请尝试以下操作:

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;

答案 2 :(得分:1)

另一个选择是使用计算字段。这些字段在数据库中使用没有空间,因此文件大小应该不成问题。并且您不需要设置它们或更新它们。

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

答案 3 :(得分:0)

转换为字符串后,请在其前面(左侧)留有空格。

一千个总是LEFT ( RIGHT ( VALUE , 6) , 3)

thousands   = left(right(space(10) + convert(varchar(100), [value]), 6), 3)

答案 4 :(得分:0)

谢谢大家!

因此,上面注释中提到的查询对我有用,如果数据库大小不足,请增加它(日志文件),然后它将起作用。