Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用min with cast nvarchar与group by一起浮动会在转换时抛出错误_Sql Server_Aggregate Functions - Fatal编程技术网

Sql server 使用min with cast nvarchar与group by一起浮动会在转换时抛出错误

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

我有一个select查询,它执行一些连接,并有几个where子句返回3个数值。此列的类型是nvarchar,我正在尝试将其转换为float,但失败并引发异常,表示“将数据类型nvarchar转换为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) 
如果我们先执行强制转换,然后使用聚合函数,是否会有问题,或者使用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,但它仍然失败,并出现相同的错误。