1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | --通过函数处理除法,获取百分比 if object_id( 'GetPassRate' , 'fn' ) is not null drop function GetPassRate go create function [dbo].[GetPassRate]( @num1 int , @num2 int ) returns nvarchar(10) as begin declare @res varchar (10) select @res = case when @num1 is null or @num2 is null then null --when @num1 = 0 then '0%' when @num1 = 0 then '100%' when @num2 = 0 then null else concat( cast ( cast (@num1 * 1.0 /@num2 as decimal (18,4)) * 100 as decimal (18,2)), '%' ) end return @res end select [dbo].GetPassRate(1,2) as passrate select [dbo].GetPassRate(18,20) as passrate select [dbo].GetPassRate(0,1) as passrate select round( convert ( float ,1)/ convert ( float ,2),2) --sql server 除法 1/2=0.5 --0.5 select round( convert ( float ,1)/ convert ( float ,2),2) --50% 0% select str(round( convert ( float ,1)/ convert ( float ,2),2)*100) + '%' as passrate select str(round( convert ( float ,0)/ convert ( float ,2),0)*100) + '%' as passrate |
示例二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | if object_id( 'GetPassRate2' , 'fn' ) is not null drop function GetPassRate2 go create function [dbo].[GetPassRate2]( @num1 int , @num2 int ) returns nvarchar(10) as begin declare @res varchar (10) select @res = case when @num1 is null or @num2 is null then null --when @num1 = 0 then '0%' when @num1 = 0 then '100%' when @num2 = 0 then null --else concat(cast(cast(@num1 * 1.0 /@num2 as decimal(18,2)) * 100 as decimal(18,2)),'%') end else concat( cast ( cast (@num1 * 1.0 /@num2 as float ) * 100 as float ), '%' ) end return @res end go select [dbo].GetPassRate2(1,2) as passrate,[dbo].GetPassRate2(0,1) as passrate, [dbo].GetPassRate2(18,20) as passrate,[dbo].GetPassRate2(0,0) as passrate go |
注:调用函数,需[dbo]. 函数名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | --保留2位小数的关键是字段类型要转成浮点数字段类型 select CONVERT ( DECIMAL (10,2),(100.0*1/7)) --在2个字段前面乘以100.0,注意是100.0不是100 select str( CONVERT ( DECIMAL (10,2),(100.0*1/2))) + '%' as passrate select str( CONVERT ( DECIMAL (10,2),(100.0*0/2))) + '%' as passrate --把被除字段转成浮点数字段类型 --取巧方法: select CONVERT ( DECIMAL (10,2),(100.0*1/(2*1.0))) --这种方法比较取巧,在被除字段乘以1.0 select CONVERT ( DECIMAL (10,2),(100.0*0/(2*1.0))) --正规的方法: select CONVERT ( DECIMAL (10,2),(100*1/ CONVERT ( FLOAT ,2))) select CONVERT ( DECIMAL (10,2),(100*1/ CONVERT ( FLOAT ,4))) select CAST ( CONVERT ( DECIMAL (10,2),(100*0/ CONVERT ( FLOAT ,2))) AS varchar ) + '%' select CAST ( CONVERT ( DECIMAL (10,2),(100*1/ CONVERT ( FLOAT ,2))) AS varchar ) + '%' select CAST ( CONVERT ( DECIMAL (10,2),(100*1/ CONVERT ( FLOAT ,4))) AS varchar ) + '%' |
NULL值赋空
1 2 | select t.CHECKDOCTOR, t.* from TableSeries t where t.CHECKDOCTOR is null select case when t.CHECKDOCTOR is null then '' else t.CHECKDOCTOR end as Doctor , t.* from TableSeries t where t.CHECKDOCTOR is null |
字符串处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | --从1截取到3 SELECT substring ( 'abcd' , 1, 3) as 字符串截取 --从左截取5位 select left ( 'HelloWorld' ,5) as 左侧截取 --从右截取5位 select right ( 'HelloWorld' ,5) as 右侧截取 --从指定的位置开始截取指定长度 select substring ( 'HelloWorld' ,charindex( 'W' , 'HelloWorld' ),3) as 指定位置指定长度截取 --获取指定字符串出现的索引位置 select charindex( 'orld' , 'HelloWorld001' ) <br> --包含 declare @str varchar (50) set @str= 'HelloWorld001' select case when charindex( 'orld' ,@str)>0 then '包含' when charindex( 'orld' , '002001' )>0 then '不包含' end as 包含 go --不包含 declare @str varchar (50) set @str= '002001' select case when charindex( 'orld' ,@str)>0 then '包含' when charindex( 'orld' , 'HelloWorld001' )>0 then '不包含' end as 不包含 |
数字小数点处理
精度是数字中的数字个数。小数位数是数中小数点右边的数字个数。例如,数 123.45 的精度是 5,小数位数是 2。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ----------------------------------数据类型---------------------------------- --最大10位(包括小数点后面),保留小数点后2位,四舍五入 --decimal(param1,param2) --第一个参数表示最大长度,包括小数点后面位数; 第二个参表示小数点后位数。 select Convert ( decimal (10,2),123.456), Convert ( decimal (6,3),123.4562) --concat,字符串拼接 select concat( Convert ( decimal (18,2),2*1.0/4)*100, '%' ) select concat( Convert ( decimal (18,2),2*1.0/3)*100, '%' ) --round()函数 --round()函数保留N位有效数字,四舍五入,有效数字后面变为0 --Round() 函数,如 Round(@num,2) 参数 @num是要原数据,2 表示保留两位有效数字 --@num的数是整数时,会忽略小数部分(其实就是进行了四舍五入) --针对Round() ,还有第三个参数, 第三个参数1是不进行四舍五入,0是进行 select round(9.0/4,2,1) select round(24.1255,2),round(24.1255,3),round(24.1255,4) select ceiling(24.222*1000)/1000 --在使用方便程度上Convert()函数要优先于Round() 函数; --除了以上两种,还可以直接对原数进行转换,用CAST() --保留小数点后两位: 注:9表示正数--返回值则为正数;9.0是浮点型--返回值也为浮点型 select CAST ( 9/4 as decimal (18,2)) --运行后结果:2.00 select CAST ( 9*1.0/4 as decimal (18,2)) --运行后结果:2.25 |
1 2 | select convert ( decimal (18,2),1.0*1/2) as mydecimal select convert ( float ,1.0*1/8) as myfloat, convert ( float ,1.0*1/3) as myfloat, cast ( convert ( float ,1.0*1/3) as decimal (18,2)) as myfloat |
博客内容主要用于日常学习记录,内容比较随意,如有问题,还需谅解!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!