代码之家  ›  专栏  ›  技术社区  ›  narcs

在转换中使用带cast nvarchar的min和group by throws错误

  •  -1
  • narcs  · 技术社区  · 6 年前

    将数据类型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”和“-”,结果中有空格。

    3 回复  |  直到 6 年前
        1
  •  0
  •   Suraj Kumar zip    6 年前

    您可以尝试使用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
    

    你可以找到现场演示 here

        2
  •  0
  •   PSK    6 年前

    你可以用 TRY_CONVERT

    SELECT COUNT(Id), MAX(TRY_CONVERT(float, id))  FROM #TEMP
    WHERE dept = 'it'
    GROUP BY dept
    

    另外,当我颠倒我的顺序,找出 最小/最大工作正常。

    MAX 也适用于varchar/nvarchar列。它将返回一个数字字符串作为场景的max,您可以将其转换为float。相反的情况不起作用,因为第一次强制转换将在MAX之前进行,如果列不是有效数字,则强制转换将失败。

        3
  •  0
  •   Mohammad Shehroz    6 年前

    你可以用这个 CAST(cast(replace(Id,'NA','') as int) AS FLOAT)