我有一个带有每个列排序功能的网格,并且一次只显示50行。
我正在使用sql server 2005作为数据库。
现在,sql server 2005中有ROW_NUMBER函数来过滤带有行号的数据,但必须使用 Over(order by [Column])
。在我的情况下,我必须使用不同列对我的网格进行排序,因此无法在order by子句中使用静态列名。限制是,我必须使用静态查询。
你们能否帮助我解决这个问题?
我有一个带有每个列排序功能的网格,并且一次只显示50行。
我正在使用sql server 2005作为数据库。
现在,sql server 2005中有ROW_NUMBER函数来过滤带有行号的数据,但必须使用 Over(order by [Column])
。在我的情况下,我必须使用不同列对我的网格进行排序,因此无法在order by子句中使用静态列名。限制是,我必须使用静态查询。
你们能否帮助我解决这个问题?
在每个列上使用多个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
或者,如果你真的想要任意行数,则可以这样做:
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as rn
我找到了一些方法来做这件事。
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