3

可能重复:
ROW_NUMBER() 在 SQL 中没有结束

我有一个对每一列进行排序的网格,一次只能显示 50 行。

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

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

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

4

2 回答 2

4

每列使用多个 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
于 2012-10-16T12:40:32.423 回答
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
于 2012-10-17T05:10:25.123 回答