1

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

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

RowNumber、c.Node_base、c.Node_forslag、sum(Score) として (c.Node_base 順で) row_number() を選択します。

FROM t_input as c

WHERE '行番号' < 11

GROUP BY c.Node_base、c.Node_forslag

ORDER BY c.Node_base desc

于 2012-09-03T04:48:19.900 に答える