【问题标题】:Error converting data type varchar to numeric using a case function使用 case 函数将数据类型 varchar 转换为数值时出错
【发布时间】:2015-07-07 21:30:49
【问题描述】:

当我选择表格时

Select 
    [Premium Amount], [Policy Number], 
    [Transaction Type Code], Insured, * 
from 
    DW.Table
where 
    [Policy Number] in ('1111111111', '2222222222')

这些是结果。

Premium Amount  Policy Number   Transaction Type Code      Insured
-12798.0000     1111111111       Cancellation              ABC Group
27000.0000      1111111111       Renewal Business          ABC Group 
-8452.7700      2222222222       Cancellation              DEF Group
10221.0000      2222222222       Renewal Business          DEF Group

我想要创建两个新列,[Original Policy Premium] 和 [Transaction Premium]。

[Original Policy Premium] 是一列,其中包含交易类型代码 = 续保业务,它将导致对应的 保费金额 = 27000.0000 保单编号 111111111。同样适用于保单编号 22222222。

让它看起来像这样。

Original Policy Premium  Transaction Premium  Policy Number   
27000.0000                -12798.0000          1111111111
10221.0000                -8452.7700           2222222222

Select 
    case 
       when [Transaction Type Code] = 'Renewal Business' 
         then [Premium Amount] 
         else '' 
    end as [Original Policy Premium],
    case 
      when [Transaction Type Code] = 'Cancellation' 
        then [Premium Amount] 
        else '' 
    end as [Transaction Premium],
    [Policy Number], 
    [Transaction Code] 
from 
    DW.Table
where 
    [Policy Number] in ('111111111', '22222222')

但运行后出现此错误。

消息 8114,第 16 级,状态 5,第 1 行
将数据类型 varchar 转换为数值时出错。

但是当我用 END AS NULL 替换 END as '' 时

Original Policy Premium  Transaction Premium   Policy Number   
    27000.0000                NULL             1111111111
    NULL                     -12798.0000       1111111111
    10221.0000                NULL             2222222222
    NULL                     -8452.7700        2222222222

【问题讨论】:

  • 更改为else null
  • 谢谢。你的答案是正确的。但请看我的编辑。

标签: sql-server


【解决方案1】:

您的案例路径返回不同的类型。它们必须是同一类型。改为:

select max(case when [Transaction Type Code] = 'Renewal Business'
                then [Premium Amount] 
                else null end) as [Original Policy Premium],
       max(case when [Transaction Type Code] = 'Cancellation'
                then [Premium Amount] 
                else null end) as [Transaction Premium],
       [Policy Number]
from table
where [Policy Number] in ('111111111', '22222222')
group by [Policy Number]

【讨论】:

  • 太棒了!但是 MAX 函数和 Group by 帮助如何做到这一点呢?使用 max 只会得到最大的数字,但没有其他数字高于 27000.0000 或 10221.0000?这些数字是独一无二的。那么它如何帮助修复它呢?
  • 它被称为条件聚合和标准技巧。例如,对于 1111111111,您有一次取消和一次续订。查看取消案例:它将产生 set - -12798.0000null。 Max 会选择 -12798.0000 。更新也是一样。与 2222222222 相同。
  • 现在我明白了。谢谢。
猜你喜欢
  • 2021-10-02
  • 1970-01-01
  • 2011-03-29
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多