2012-10-16 53 views
3

可能重复:
ROW_NUMBER() without over in SQL需要SQLSERVER使用ROW_NUMBER不超过2005

我有一个网格,每列进行排序,并在某一时刻只显示50行。

我正在使用sql server 2005作为数据库。

现在在sql server 2005中有ROW_NUMBER函数来用行号过滤数据,但是Over(order by [Column])是必须使用的。在我的情况下,我不得不排序我的网格与不同的列,所以我不能按顺序使用静态列名称。限制是,我必须使用静态查询。

你们能帮我解决这个问题吗?每列

+0

[您可能会发现我的答案在这里有用的,但期望的糟糕表现(http://stackoverflow.com/questions/12623167/removing-duplication-in-dynamic-row-number-over-order-by-声明/ 12623397#12623397) –

+1

@MartinSmith。你有没有得到我的问题。我可以不用结束使用Row_number,也可以使用按列动态排序 – Sharad

回答

3

使用几个ROW_NUMBER条款,并选择相关的一个:

.... 
    ROW_NUMBER() OVER (ORDER BY [Column1]) as rn1, 
    ROW_NUMBER() OVER (ORDER BY [Column2]) as rn2, 
    ROW_NUMBER() OVER (ORDER BY [Column3]) as rn3, 
    ROW_NUMBER() OVER (ORDER BY [Column4]) as rn4 
.... 

使用CASE表达式。注:所有数据类型必须兼容

ROW_NUMBER() OVER (ORDER BY CASE @sort 
        WHEN 1 THEN [Column1] 
        WHEN 1 THEN [Column2] 
        WHEN 1 THEN [Column3] 
        ... 
        END 

OR如果你真的想那么任意行号做:

ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as rn 
0

我找到了一些方法来做到这一点。

SELECT 
    OrderID, CustomerID, EmployeeID, OrderDate, ShippedDate, 
    @Offset, @Limit, @SortColumn, @SortDirection 
FROM 
    Orders 
WHERE 
    ROW_NUMBER() OVER 
    (
    ORDER BY 
     /* same expression as in the ORDER BY of the whole query */ 
) BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize 
    /* AND more conditions ... */ 
ORDER BY 
    CASE WHEN @SortDirection = 'A' THEN 
    CASE @SortColumn 
     WHEN 'OrderID' THEN OrderID 
     WHEN 'CustomerID' THEN CustomerID 
     /* more... */ 
    END 
    END, 
    CASE WHEN @SortDirection = 'D' THEN 
    CASE @SortColumn 
     WHEN 'OrderID' THEN OrderID 
     WHEN 'CustomerID' THEN CustomerID 
     /* more... */ 
    END 
    END DESC