首页 > 解决方案 > 即使变量/列已经是浮点数据类型,也将数据类型 varchar 转换为浮点数时出错

问题描述

我在 SQL Server 2012 (v11) 中运行。我知道许多其他人围绕这个问题提出了问题,但没有一个对我自己的困境特别有帮助。我还有两个问题要解决,非常感谢您提供帮助。

在某些情况下,我目前正在尝试(目标 1)转置一个包含三个单独的唯一 ID 和一些在 5 年内收集的调查数据的表。目前,该表的结构使得一个记录等同于 5 年中任何一年的单个调查数据。但是,我想转置数据,以便一条记录等同于个人的全部调查数据。我试图通过使用过去成功实现的交叉表来实现这一目标。

但是,我的(目标 2)当前问题是我不断收到以下错误:

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

让我感到困惑的是,在下面的代码中,EntityID 在第 89 行,但它是一个数字,并且已经作为浮点数据类型存储在 SQL 中。那么为什么我会收到此错误消息?

这是我的参考代码,非常欢迎任何可以更好地实现目标 1 的建议。

SELECT EntityID
  , insig_id
  , UserID
  , Cohort
  , SUM(CASE WHEN MY = '1' THEN pam_score  ELSE NULL END) AS MY1_PAM_SCR
  , SUM(CASE WHEN MY = '1' THEN pam_lvl  ELSE NULL END) AS MY1_PAM_LVL
  , MAX(CASE WHEN MY = '1' THEN srvy_date ElSE NULL END) AS MY1_SVY_DAT
  , SUM(CASE WHEN MY = '2' THEN pam_score  ELSE NULL END) AS MY2_PAM_SCR
  , SUM(CASE WHEN MY = '2' THEN pam_lvl  ELSE NULL END) AS MY2_PAM_LVL
  , MAX(CASE WHEN MY = '2' THEN srvy_date ElSE NULL END) AS MY2_SVY_DAT
  , SUM(CASE WHEN MY = '3' THEN pam_score  ELSE NULL END) AS MY3_PAM_SCR
  , SUM(CASE WHEN MY = '3' THEN pam_lvl  ELSE NULL END) AS MY3_PAM_LVL
  , MAX(CASE WHEN MY = '3' THEN srvy_date ElSE NULL END) AS MY3_SVY_DAT
  , SUM(CASE WHEN MY = '4' THEN pam_score  ELSE NULL END) AS MY4_PAM_SCR
  , SUM(CASE WHEN MY = '4' THEN pam_lvl  ELSE NULL END) AS MY4_PAM_LVL
  , MAX(CASE WHEN MY = '4' THEN srvy_date ElSE NULL END) AS MY4_SVY_DAT
  , SUM(CASE WHEN MY = '5' THEN pam_score  ELSE NULL END) AS MY5_PAM_SCR
  , SUM(CASE WHEN MY = '5' THEN pam_lvl  ELSE NULL END) AS MY5_PAM_LVL
  , MAX(CASE WHEN MY = '5' THEN srvy_date ElSE NULL END) AS MY5_SVY_DAT
  into #svy_onerow
FROM #svy_counter2
    GROUP BY EntityID, UserID, insig_id, Cohort
    ORDER by insig_id

在此先感谢您,伟大的人可以提供的任何帮助。

谢谢!

标签: sqlsql-server

解决方案


第 89 行的错误消息是代码块,不一定是第 89 行。由于您有多个函数引用 #svy_counter2 中的 3 个字段,因此您需要确认 pam_score、pam_lvl 和 srvy_date 是这些函数的有效数据类型。我已经看到日期存储在 varchar 字段('20190101')中,如果您尝试获取最大值,除非您明确地将其转换为日期、日期时间数据类型,否则您将无法获得所需的内容。

尝试这样的事情: select distinct cast(pam_score as float) from #svy_counter2 select distinct cast(pam_lvl as float) from #svy_counter2 select distinct cast(srvy_date as datetime) from #svy_counter2 看看其中一个是否对您有错误。这将告诉您该领域是问题所在。


推荐阅读