2017-08-27 143 views
0

我正在计算一个小时数,它取决于不同表中的列值。在SQL存储过程中将值转换为4位小数

假设我有hourlyrate from table1rates from table2。如果rates = 4table2其中4代表4位小数,则根据计算结果,小时率应该给小数点后4位。

这里是我的计算:

CONVERT(VARCHAR, CAST(
CASE WHEN table2.rates ='4' 
     THEN table1.hourlyrate 
     ELSE table1.hourlyrate END as decimal(18,4))) 

如果我把价值得到4DP?有什么建议吗?

+1

程序代码(如存储过程)是**高度特定供应商的** - 所以请添加标签到指定是使用了'mysql','postgresql','SQL服务器','oracle'或'db2' - 或者其他的东西。 –

+0

如果rates = 2会怎么样?它只需要2个小数位 – jophab

+0

'THEN table1.hourlyrate ELSE table1.hourlyrate END'部分没有任何意义。 –

回答

0

您的转换应该是then,而不是围绕整个case表达之后。

select 
    ... 
    , HourlyRate = case when table2.rates in ('2','4') 
      then convert(varchar(32),convert(decimal(18,4),table1.hourlyrate)) 
     else table1.hourlyrate 
     end 
    ) 
from ... 

在SQL Server 2012+,你可以使用try_convert()而不是convert()返回而不是错误null值如果转换失败。

select 
    ... 
    , HourlyRate = case when table2.rates in ('2','4') 
      then convert(varchar(32),try_convert(decimal(18,4),table1.hourlyrate)) 
     else table1.hourlyrate 
     end 
    ) 
from ... 

rextester演示:http://rextester.com/KYXEV38143

回报:

+-------+------------+------------+ 
| rates | hourlyrate | HourlyRate | 
+-------+------------+------------+ 
|  1 | 1.23456789 | 1.23456789 | 
|  2 | 1.23456789 | 1.2346  | 
|  2 |   | NULL  | 
|  3 | 1.23456789 | 1.23456789 | 
|  4 | 1.23456789 | 1.2346  | 
|  4 | 1   | 1.0000  | 
|  4 | N/A  | NULL  | 
+-------+------------+------------+ 
0

如果2012+另一种选择是使用格式()

Declare @YourTable table (HourlyRate varchar(50),Rate varchar(10)) 
Insert Into @YourTable values 
('125 ','4') 
,('85.25' ,'2') 
,('75.1255' ,'') 
,('9.33333333' ,'6') 


Select format(convert(float,HourlyRate),'0.'+left('0000000',Rate)) 
From @YourTable 

返回

125.0000 
85.25 
75 
9.333333 
相关问题