0

この簡略化されたバージョンに起因する問題があります: Sql Server 2008 に次のようなテーブルがあります (これは私の検索に固有の非正規化テーブルです):

ItemId | CategoryId | Descr       | ExtendedDescription
0001   |          1 | Mouse X     | Blue mouse
0002   |          1 | Blue Pen    | Beautiful ....
0003   |          2 | Blue Pencil | Pencil with ...
0004   |          2 | Eraser      | Eraser with ....

このテーブルで単語 (「青」など) を検索し、単語が表示される場所に基づいて結果にランクを割り当て、ランクを合計した CategoryId で結果をグループ化する必要があります。私にはそれができます。結果をページ分割しようとすると問題が発生します。これは私が試したストアド プロシージャです (検索する単語は修正されましたが、それをパラメーターにする方法はわかっています。ID をフィルター処理してページネーションを行う方法も知っています)。

CREATE PROCEDURE [dbo].[spSearch]

AS
BEGIN

SET NOCOUNT ON;

SELECT 
      [CategoryId],
      SUM(
        CASE WHEN (PATINDEX('%Blue%', Descr) > 0) THEN 100 ELSE 0 END +
        CASE WHEN (PATINDEX('%Blue%', ExtendedDescription) > 0) THEN 10 ELSE 0 END
        ) AS Ranking, 
      ROW_NUMBER() OVER(ORDER BY CategoryId DESC) ID
  FROM [dbo].[Data]
  where (Descr like '%Blue%' or
    ExtendedDescription like '%Blue%') 
GROUP BY CategoryId
ORDER BY Ranking DESC
END

このspを使用すると、次の結果が得られます。

CategoryId | Ranking | ID
0001       |   110   | 2
0002       |   100   | 1

問題は、結果をページネーションするには、ID (ROW_NUMBER) がランキングの降順で生成される必要があることですが、このように CategoryId の順序で生成されます。この方法でspを変更しようとすると:

ROW_NUMBER() OVER(ORDER BY Ranking DESC) ID

ランキングは列ではないため、sp を保存できません。何かヒントはありますか?

4

1 に答える 1