Sql server 将varchar转换为十进制并比较查询中的值

Sql server 将varchar转换为十进制并比较查询中的值,sql-server,Sql Server,我想在查询中比较varchar列中的十进制值。 如果每个groupid的最大年龄高于最小年龄*10,则应进行比较 例如,年龄列为varchar: ID | Name | Age | GroupID -------------------------- 1 | AAA | 10.1 | 1 2 | BBB | 11 | 1 3 | CCC | 31.2 | 1 4 | DDD | 30.4 | 2 这就是我在寻找解决方案后尝试做的事情 SELECT TOP 10 * FRO

我想在查询中比较varchar列中的十进制值。 如果每个groupid的最大年龄高于最小年龄*10,则应进行比较

例如,年龄列为varchar:

ID | Name | Age  | GroupID
--------------------------
1  | AAA  | 10.1 | 1
2  | BBB  | 11   | 1
3  | CCC  | 31.2 | 1
4  | DDD  | 30.4 | 2
这就是我在寻找解决方案后尝试做的事情

SELECT TOP 10 * FROM Groups g
JOIN People p1 ON p1.GroupID = g.ID
JOIN People p2 ON p2.GroupID = g.ID
WHERE CONVERT(DECIMAL(8,2),ISNULL(p1.Age,0)) > (CONVERT(DECIMAL(8,2),ISNULL(p2.Age,0)) * 10)

提前谢谢

我想您应该使用窗口函数来实现:

select t.*
from (select t.*,
             min(case when isnumeric(Age) = 1 then cast(Age as float) end) over
                 (partition by groupID) as minage
      from table t
     ) t
where age > 10 * minage;

case语句有助于防止年龄不是数字的事件中出现错误。此外,我认为float对于age是一种足够好的数据类型,尽管您也可以使用decimal。

age在您的db中真的是一个varchar吗?所以第一个想法应该是改变这一点!很遗憾,我无法更改列类型。首先感谢您的帮助!但我发现[Err]42000-[SQL Server]附近的语法不正确。我觉得这个语法正确。你能用表格的结构编辑你的问题吗?看起来年龄与其他列存储在一个单独的表中。