Sql server 使用min with cast nvarchar与group by一起浮动会在转换时抛出错误
我有一个select查询,它执行一些连接,并有几个where子句返回3个数值。此列的类型是nvarchar,我正在尝试将其转换为float,但失败并引发异常,表示“将数据类型nvarchar转换为float时出错”。我无法使用下面的虚拟表重新设置错误,但这是我迄今为止使用的虚拟数据,但在我的select语句结果中没有:Sql server 使用min with cast nvarchar与group by一起浮动会在转换时抛出错误,sql-server,aggregate-functions,Sql Server,Aggregate Functions,我有一个select查询,它执行一些连接,并有几个where子句返回3个数值。此列的类型是nvarchar,我正在尝试将其转换为float,但失败并引发异常,表示“将数据类型nvarchar转换为float时出错”。我无法使用下面的虚拟表重新设置错误,但这是我迄今为止使用的虚拟数据,但在我的select语句结果中没有: CREATE TABLE #TEMP(Id nvarchar(10), dept nvarchar(10)) INSERT INTO #TEMP VALUES('NA', 'cs
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)
如果我们先执行强制转换,然后使用聚合函数,是否会有问题,或者使用GROUPBY子句以这种方式执行查询是否会有问题
请注意,我的表将有“NA”和“-”,结果中有空格。您可以使用
TRY\u CONVERT
使其始终像下面那样工作
SELECT COUNT(Id), MAX(TRY_CONVERT(float, id)) FROM #TEMP
WHERE dept = 'it'
GROUP BY dept
而且,当我颠倒我施放的顺序并找出
最小值/最大值工作正常
CAST(MIN(Id) AS FLOAT)
这是因为
MAX
也适用于varchar/nvarchar列。它将为您的场景返回一个数字字符串作为max,您可以将其转换为float。反向方案不起作用,因为第一次强制转换将在MAX之前进行,如果列不是有效的数字,则强制转换将失败。您可以尝试使用如下所示的case语句
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 dept,
MAX(CAST(case Id when 'NA' then 0 else Id end AS FLOAT))
FROM #TEMP
GROUP BY dept
DROP TABLE #TEMP
dept (No column name)
------------------------
cs 1400
it 1750
输出如下所示
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 dept,
MAX(CAST(case Id when 'NA' then 0 else Id end AS FLOAT))
FROM #TEMP
GROUP BY dept
DROP TABLE #TEMP
dept (No column name)
------------------------
cs 1400
it 1750
您可以找到现场演示您可以使用此
CAST(CAST(替换(Id,'NA','')为int)为FLOAT)
您的预期输出是什么?我的预期输出是将查询中的最小值或最大值作为FLOAT返回。但更重要的是,我想找出根本原因,那就是为什么我先强制转换,然后进行聚合时它会抛出异常。请现在检查我的答案。根本原因是你在某个地方有一些不可靠的数据,先强制转换,然后最大化,然后转换每个值。第一次最大化和第二次铸造只是铸造最大值,这显然有效。您可以通过使用try_convert函数找到不可靠的数据,该函数将为未转换的行返回null。我怀疑我们是否可以在不访问实时数据的情况下提供帮助,因为将数据类型nvarchar转换为float的错误非常明显错误
,因此有些字符串数据当前未转换为float值-您只要找到它。我不知道您有多少条记录,但您可以通过消除正确值的过程来找到它。设计数据库时使用正确数据类型的好理由:)是的,这也可以,但请帮助我找出在现有方案中失败的根本原因。因此,在我的方案中,max也失败了。我知道我的问题没有提供一个复制,但这是我能解释的最接近我的问题Max不会失败,它对字符串和数字都有效。所以它永远不会失败。是的,它不会失败,但由于某种原因,它在我的场景和数值中失败了(我不知道他们是否有一些特殊的字符,并试图找到答案)。这就是为什么我在表中添加了空格,但CAST会处理它。我在UDF中有select语句,它以不同的方式使用case a lil,因为我有多个场景,它可能会增加。但是试图找到我现有解决方案失败的根本原因。错误出现在#TEMP的行选择CAST(Id为FLOAT)中,因为NA无法转换为FLOAT。您还可以使用case语句将值传递给UDF,如图所示。您应该编写简单的MAX(Id),而不是强制转换,这样它就可以工作。\n是的,但只有当我的select具有该值时才可以。在我的例子中,我只看到3个数值,即1550、1665、1750,但它仍然失败,并出现相同的错误。