ROW_NUMBER()函数返回varchar值而不是int

时间:2012-06-28 08:23:25

标签: sql sql-server type-conversion row-number

我正在使用SQL Server中的ROW_NUMBER()函数创建一个名为RowNumber的新列。

但是当我稍后在同一个查询中引用WHERE语句中的这个新字段时,我得到了这个错误,即使该字段应该是一个整数:

  

将varchar值'RowNumber'转换为数据类型int

时转换失败

这是我的问题:

SELECT 
   ROW_NUMBER() OVER(PARTITION BY c.Node_base ORDER BY sum(c.Score) DESC) AS "RowNumber",  
   c.Node_base, c.Node_forslag, sum(Score)
FROM         
   t_input as c
WHERE 'RowNumber' < 11
GROUP BY c.Node_base, c.Node_forslag
ORDER BY c.Node_base desc

4 个答案:

答案 0 :(得分:6)

您无法从SELECT子句中的WHERE子句引用计算列 - 即使可以,单引号也会引入字符串文字,而不是列引用。使用CTE或子查询。

;With Sums as (
    SELECT c.Node_base, c.Node_forslag,SUM(c.Score) as TotScore
    FROM t_input as c
    GROUP BY c.Node_base, c.Node_forslag
), NumberedRows as (
   SELECT *,ROW_NUMBER() OVER(PARTITION BY Node_base ORDER BY TotScore DESC) AS RowNumber
   FROM Sums
)
select * from NumberedRows
WHERE RowNumber <11
order by Node_base desc

根本不需要引用名称RowNumber - 它不是保留字,也不包含特殊字符。

答案 1 :(得分:1)

使用[RowNumber]代替"RowNumber"

SET QUOTED_IDENTIFIER为ON(默认)时,所有用双引号分隔的字符串都被解释为对象标识符。

您还必须使用子查询来引用row_number()子句中的where,例如:

select  ...
from    (
        SELECT  ROW_NUMBER() OVER(PARTITION BY Node_base 
                    ORDER BY sum(Score) DESC) AS RowNumber
        ,       ...
        from    t_input
        ) as SubQueryAlias
where   RowNumber < 11

或者在您的情况下,我认为您可以使用top

select  top 11 Node_base
,       Node_forslag
,       sum(Score)
from    t_input
group by
        Node_base
,       Node_forslag
order by
        sum(Score) desc

答案 2 :(得分:1)

声明

WHERE 'RowNumber' <11

您将字符串文字“RowNumber”与数字11进行比较。

只需删除引号:

WHERE RowNumber <11

答案 3 :(得分:0)

选择row_number()over(按c.Node_base排序)为RowNumber,        c.Node_base,c.Node_forslag,sum(Score)

FROM t_input as c

在哪里'RowNumber'&lt; 11

GROUP BY c.Node_base,c.Node_forslag

ORDER BY c.Node_base desc