3

重複の可能性:
SQL で over のない ROW_NUMBER()

各列で並べ替えを行うグリッドがあり、一度に 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 に答える