【问题标题】:SQL Case statement error Msg 8114SQL Case 语句错误消息 8114
【发布时间】:2013-04-28 06:05:36
【问题描述】:

尝试使用 SQL Server 2008 构建一个简单的 case 语句并遇到一个问题,给我以下错误消息:

Msg 8114, Level 16, State 5, Line 6 Error converting data type varchar to numeric.

我已将导致问题的脚本隔离为以下内容:

CASE WHEN tPersonLocationHist.LocationCode = 'DC' 
        AND (tPersonJobHist.FullTimeEquivalent = 1) 
        AND (MONTH(tPersonStatusHist.LatestHireDate) < 10) 
        THEN tPersonStatusHist.NormalHoursPerWeek / 5

tPersonStatusHist.NormalHoursPerWeek 格式为十进制;但是,我无法计算。

有什么建议吗?结果计算需要采用十进制形式(到两位小数)。

即使我将 THEN 语句更改为“7.5”,它也会返回:

Msg 245, Level 16, State 1, Line 6 Conversion failed when converting the varchar value '7.5' to data type int.

我尝试过使用CONVERT(decimal(4,2),tPersonJobHist.NormalHoursPerWeek * 7.5),但也没有运气。

唯一有效的方法是: CONVERT(int,tPersonJobHist.NormalHoursPerWeek * 7.5),但它会去掉小数,只给出整个整数。

正如您可能知道的那样,我是 SQL 新手,并且仍在学习绳索,因此非常感谢您提供的任何帮助。

【问题讨论】:

  • NormalHoursPerWeek的数据类型是什么?
  • 数据类型是 shrsDecimal4 我的大多数其他 THEN 语句都返回一个定义的结果(即“0”或“8”)。我只有几个需要计算的部分......我需要为计算部分做单独的 CASE 语句吗?

标签: sql sql-server-2008 tsql


【解决方案1】:

您的其他案例/其他是否返回 varchar?它们都应该返回相同的数据类型。您可能需要强制转换/转换它们。

CAST(CONVERT(decimal(4,2),tPersonJobHist.NormalHoursPerWeek * 7.5) AS varchar(50))

【讨论】:

  • 我试过这个答案并收到以下错误消息:Msg 8115, Level 16, State 8, Line 6 Arithmetic overflow error conversion numeric to data type numeric。
  • 您可能会超过 99.99,因此您可以尝试 decimal(13,2) 或不会溢出数据的大数据。此外,如有必要,应检查您的其他 cases 和 else 是否存在类似问题。
【解决方案2】:

先转十进制再除法:

THEN CONVERT(decimal(4,2), tPersonStatusHist.NormalHoursPerWeek) / 5

或者演员是一种选择:

THEN CAST(tPersonStatusHist.NormalHoursPerWeek AS decimal(4,2)) / 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2023-03-25
    • 1970-01-01
    • 2014-08-09
    相关资源
    最近更新 更多