1

ストアド プロシージャにページングと動的orderby句が必要です (THAT TOO ON MORE THAN ONE COLUMN)。フォローしようとしましたが、エラーが発生します

rank() よりも Row_number() を使用できないようです

ウィンドウ関数は、別のウィンドウ関数または集計のコンテキストでは使用できません。

linq から sql を除いて、これを達成するための代替手段はありますか

SELECT  [t8].[AssetId], 
            [t8].[WorkOrderId], 
            [t8].[IssueDescription] AS [WorkOrderDescription], 
            [t8].[value] AS [Type], 
            [t8].[WorkOrderStatusTypeName] AS [Status],
            [t8].[value2] AS [StartDate], 
            [t8].[CompletedDate] AS [CompleteDate], 
            [t8].[value22] AS [CompletedBy], 
            ISNULL([t8].[value3],0) AS [Hours]
    FROM    (
                SELECT  ROW_NUMBER() 
                    OVER (ORDER BY  CASE WHEN @sortColumnName = 'default' THEN (RANK() over( order by [t7].[WorkOrderStatusTypeId] ASC, [t7].[WorkOrderId])) END ,
                                    CASE WHEN @sortColumnName = 'WorkOrderId' AND @sortOrder = 'asc' THEN [t7].[WorkOrderId] END ASC,
                                    CASE WHEN @sortColumnName = 'WorkOrderId' AND @sortOrder = 'desc' THEN [t7].[WorkOrderId] END DESC
                    ) AS [ROW_NUMBER],  
                    [t7].[AssetId], 
                    [t7].[WorkOrderId], 
                    [t7].[IssueDescription], 
                    [t7].[value], 
                    [t7].[WorkOrderStatusTypeName], 
                    [t7].[value2], 
                    [t7].[CompletedDate],
                    [t7].[value22], 
                    [t7].[value3]
            from    --Different tables      
            ) as t8     
    WHERE       [t8].[ROW_NUMBER] BETWEEN ((@pageIndex-1) * @pageSize)+ 1 AND @pageIndex * @pageSize
    ORDER BY    [t8].[ROW_NUMBER]
4

3 に答える 3

2

使用済み

SELECT  CASE    
        WHEN @sortColumnName ='default' AND @sortOrder = 'asc'  then row_number() over (order by [t7].[WorkOrderStatusTypeId], [t7].[CompletedDate] ASC) 
        WHEN @sortColumnName ='WorkOrderId' AND @sortOrder = 'asc'  then row_number() over (order by [t7].[WorkOrderId] ASC) 
        WHEN @sortColumnName ='WorkOrderId' AND @sortOrder = 'desc' then row_number() over (order by [t7].[WorkOrderId] DESC)
        END AS [ROW_NUMBER], 

それ以外の

SELECT  ROW_NUMBER() 
        OVER (ORDER BY  CASE WHEN @sortColumnName = 'default' THEN (RANK() over( order by [t7].[WorkOrderStatusTypeId] ASC, [t7].[WorkOrderId])) END ,
                        CASE WHEN @sortColumnName = 'WorkOrderId' AND @sortOrder = 'asc' THEN [t7].[WorkOrderId] END ASC,
                        CASE WHEN @sortColumnName = 'WorkOrderId' AND @sortOrder = 'desc' THEN [t7].[WorkOrderId] END DESC
        ) AS [ROW_NUMBER],

RowNumber()やRank()のようなネストされたウィンドウ関数を一緒に持つことはできません。代わりに、caseステートメント内で使用できます。

于 2012-06-05T08:57:46.243 に答える
1

デフォルトの順序を2列にしたいようRANK()で、両方のデフォルトのソート基準を1つのケースに入れようとして使用しようとしました。

どうやら、それは不可能です。明らかなオプションの 1 つは、2 つの列を 2 つの CASE に分割し、@sortColumnName = 'default'条件を繰り返すことです。

ROW_NUMBER() 
OVER (ORDER BY  CASE WHEN @sortColumnName = 'default' THEN [t7].[WorkOrderStatusTypeId] END ASC,
                CASE WHEN @sortColumnName = 'default' THEN [t7].[WorkOrderId] END ASC,
                CASE WHEN @sortColumnName = 'WorkOrderId' AND @sortOrder = 'asc' THEN [t7].[WorkOrderId] END ASC,
                CASE WHEN @sortColumnName = 'WorkOrderId' AND @sortOrder = 'desc' THEN [t7].[WorkOrderId] END DESC

一方、2 番目と 3 番目の CASE を 1 つにマージできることは簡単にわかります。これは、対応する条件が真の場合、両方で同じ式が返されるためです。したがって、代わりにできることは次のとおりです。

ROW_NUMBER() 
OVER (ORDER BY  CASE WHEN @sortColumnName = 'default' THEN [t7].[WorkOrderStatusTypeId] END ASC,
                CASE WHEN @sortColumnName = 'default' OR @sortColumnName = 'WorkOrderId' AND @sortOrder = 'asc' THEN [t7].[WorkOrderId] END ASC,
                CASE WHEN @sortColumnName = 'WorkOrderId' AND @sortOrder = 'desc' THEN [t7].[WorkOrderId] END DESC

ご覧のとおり、2 番目の CASE はWorkOrderId ASC、その列が引数で明示的に指定された場合と'default'が指定された場合の両方で順序を設定するために使用されます。

于 2012-06-04T19:39:23.430 に答える