SQL数据转换&除法

时间:2018-03-22 14:07:52

标签: sql sql-server-2008 type-conversion

我正在尝试编写一条SQL语句,表明正在给出什么样的佣金。我坚持最后一部分,显示了给出的百分比,因为SQL不会将char值转换为money。 我是新手,所以我的转换尝试可能完全是假的。

CASE 
   WHEN VehicleSales.CommissionSP1 ='500' then 'Flat'
   WHEN VehicleSales.CommissionSP1 = '0' then 'Not Applicable'
      else Convert(int, VehicleSales.CommissionSP1) / Convert (int, VehicleSales.GrossProfit)
END AS Commission_Type

3 个答案:

答案 0 :(得分:0)

我会在分母中抛出一个浮点数并输入逻辑以防止被零除:

CASE 
   WHEN VehicleSales.CommissionSP1 ='500' then 'Flat'
   WHEN VehicleSales.CommissionSP1 = '0' then 'Not Applicable'
      else cast(VehicleSales.CommissionSP1 as int)/ case when cast(VehicleSales.GrossProfit as float)=0 then 1 else cast(VehicleSales.GrossProfit as float) end
END AS Commission_Type

答案 1 :(得分:0)

此处case表达式存在两个问题:

  1. 您可能会被零错误划分。
  2. 您正尝试在同一case表达式中返回多种数据类型。
  3. 如果您绝对需要返回FlatNot Applicable或百分比,则需要将该百分比作为nvarchar / varchar字符串返回:

    case VehicleSales.CommissionSP1
       when '500' then 'Flat'
       when '0' then 'Not Applicable'
       else convert(nvarchar(20),isnull(convert(int,VehicleSales.CommissionSP1)
                                        / nullif(convert(decimal(10,2),VehicleSales.GrossProfit),0)
                                       ,0)
                   )
       end as Commission_Type
    

    我建议您不要在同一列中返回FlatNot Applicable值作为百分比。就个人而言,我会选择一个包含佣金类型的列,另一个包含相关值的列。这样,您可以在佣金类型组中进行汇总,而无需一直担心convert您的数据:

    select case VehicleSales.CommissionSP1
             when '500' then 'Flat'
             when '0' then 'Not Applicable'
             else 'Percentage'
             end as Commission_Type
          ,case VehicleSales.CommissionSP1
             when '500' then 500    -- I am assuming you actually have some way of knowing what is flat beyond hard coding values here.
             when '0' then 0
             else isnull(convert(int,VehicleSales.CommissionSP1)
                                     / nullif(convert(decimal(10,2),VehicleSales.GrossProfit),0)
                                    ,0)
             end as Commission
    

答案 2 :(得分:0)

它会将varchar转换为smallmoney。学会打破这个问题。

列(甚至是大小写)只能是一种数据类型。

这不会保护varchar中的数字或利润除以零。

declare @T table (com varchar(10), profit varchar(10));
insert into @T values ('0', '1000'), ('500', '1000'), ('12', '1000'), ('100', '1000');
select t.*, cast(com as smallmoney) comM, CAST(profit as smallmoney) as profitM 
     , case com when '0'   then 'Flat'
                when '500' then 'Not Applicable'
                else            cast(cast(com as smallmoney) / 
                                     CAST(profit as smallmoney) as varchar(100))
       end as smart
from @T t