2012-10-16 2 views
3

가능한 중복을 ROW_NUMBER를 사용해야합니다 :
ROW_NUMBER() without over in SQL는 SQLSERVER에서 이상없이 2005

나는 각 열을 정렬하여 그리드를 가지고 한 번에 50 행을 표시해야합니다.

데이터베이스로 SQL Server 2005를 사용하고 있습니다.

이제 행 번호가있는 데이터를 필터링하기 위해 SQL Server 2005에 ROW_NUMBER 함수가 있지만 Over(order by [Column])은 필수 요소입니다. 내 경우에는 다른 열을 사용하여 그리드를 정렬해야하므로 by by 절에서 정적 열 이름을 사용할 수 없습니다. 제한, 정적 쿼리를 사용해야합니다.

이 문제에 대해 저를 도와 줄 수 있습니까?

+0

[현재 유용 내 대답을 찾을 수 있지만 나쁜 성능을 기대할] (http://stackoverflow.com/questions/12623167/removing-duplication-in-dynamic-row-number-over-order-by-를 statement/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 

또는 호환되어야합니다 : 나는 그것을 할 수있는 방법을 발견

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