【发布时间】:2019-01-24 07:05:33
【问题描述】:
我有一个选择查询,它执行一些连接和几个返回 3 个数值的 where 子句。此列的类型是 nvarchar,我正在尝试将其转换为 float,但失败并抛出异常“Error convert data type nvarchar to float”。我无法用下面的虚拟表重现错误,但这是我目前所拥有的,它适用于这个虚拟数据,但不适用于我的 select 语句结果:
CREATE TABLE #TEMP(Id nvarchar(10), dept nvarchar(10))
INSERT INTO #TEMP VALUES('NA', 'cs')
INSERT INTO #TEMP VALUES('1550 ', 'it')
INSERT INTO #TEMP VALUES(' 1665', 'it')
INSERT INTO #TEMP VALUES('NA', 'cs')
INSERT INTO #TEMP VALUES(' 1750 ', 'it')
INSERT INTO #TEMP VALUES('1400', 'cs')
SELECT COUNT(Id), MAX(CAST(Id AS FLOAT)) FROM #TEMP
WHERE dept = 'it'
GROUP BY dept
--WHERE Id NOT IN ('NA', '-')
DROP TABLE #TEMP
此外,当我颠倒我的施法顺序并找出最小值/最大值时,它工作得很好。
CAST(MIN(Id) AS FLOAT)
如果我们先进行强制转换然后使用聚合函数会出现问题,还是使用 group by 子句以这种方式进行查询是否存在问题?
请注意,我的表格将在结果中包含 'NA'、'-' 和空格。
【问题讨论】:
-
你的预期输出是什么?
-
我的预期输出是将查询中的最小值或最大值作为浮点数返回。但更重要的是,我想找出为什么在我先投射然后进行聚合时抛出异常的根本原因
-
现在请检查我的答案。
-
根本原因是你在某处有一些不可靠的数据,首先转换然后最大化转换每个值。先取最大值,然后再施放只是施放明显有效的最大值。您可以使用 try_convert 函数找到不可靠的数据,该函数将为未转换的行返回 null。
-
我怀疑我们是否可以在不访问实时数据的情况下提供帮助,因为错误很明显
Error converting data type nvarchar to float所以有一些字符串数据当前没有转换为浮点值 - 你只需要找到它。我不知道您有多少记录,但您可以通过消除正确值的过程找到它。设计数据库时使用正确数据类型的充分理由:)
标签: sql-server aggregate-functions