我正在使用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
答案 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