1

我正在使用ROW_NUMBER()SQL Server 中的函数来创建一个名为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

4 回答 4

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- 它不是保留字,并且不包含特殊字符。

于 2012-06-28T08:26:44.213 回答
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
于 2012-06-28T08:24:55.250 回答
1

在声明中

WHERE 'RowNumber' <11

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

只需删除引号:

WHERE RowNumber <11
于 2012-06-28T08:26:13.793 回答
0

选择 row_number() over (order by c.Node_base) as RowNumber, c.Node_base, c.Node_forslag, sum(Score)

从 t_input 作为 c

WHERE '行号' < 11

按 c.Node_base、c.Node_forslag 分组

ORDER BY c.Node_base desc

于 2012-09-03T04:48:19.900 回答