2013-06-19 175 views
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 .... 

我需要在此表中搜索一个单词(如“Blue”),根据单词出现的位置为结果指定一个等级,并将结果按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。 你有什么提示吗?

回答

1

我想用Common Table expressionCTE)就可以解决这个

试试这个

;WITH cte AS 
(
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 
) 

SELECT ROW_NUMBER() OVER(ORDER BY Ranking DESC) AS r_no, 
     Ranking, 
     ID 
FROM cte 
+0

谢谢!正是我需要的!我的下一本手册是关于Sql Server的,因为我不了解CTE。 –