0

ページングを使用して各 ItemCategoryID で 5 つのレコードを選択しようとしています。以下のクエリを使用して、各カテゴリで 5 つのレコードを取得できますが、ページ サイズ 10 を宣言したため、ページングは​​機能しませんが、19 のレコードと @ItemCounter を取得しています。 TotalCount は 45 になっています...解決方法がわかりません..クエリは次のとおりです。

DECLARE @PageIndex int = 1
DECLARE @PageSize int = 10
DECLARE @StartRow int
DECLARE @EndRow int
SET @StartRow = (@PageSize * (@PageIndex - 1))  + 1  
SET @EndRow = @PageSize * @PageIndex + 1
DECLARE @ItemCounter int
SELECT @ItemCounter = Count(*)FROM dbo.Auctions WHERE AuctionStatus=1;
WITH Auctions AS
    (
        SELECT  ROW_NUMBER() OVER 
        (PARTITION BY ItemCategoryID  ORDER BY AuctionID) AS RowNumber,                 
            AuctionID, 
            ItemCategoryID  ,                             
            @ItemCounter TotalCount                         
            FROM Auctions                 
            WHERE                 
            AuctionStatus=1 
     )

    SELECT a.* FROM Auctions a  
    WHERE  a.RowNumber <=3 AND a.RowNumber 
    BETWEEN @StartRow AND @EndRow - 1

前もって感謝します。

4

1 に答える 1

2
a.RowNumber <=3 AND a.RowNumber BETWEEN @StartRow AND @EndRow - 1

これから何を期待しますか?行番号は開始と終了の間になければならず、かつ3 以下でなければなりませんか? スタートイズ4とは?3 を超える End は無関係です。

ここで、あなたの問題に対して正しく述べられている要件は次のとおりです。

  • アイテム カテゴリごとに、ステータス = 1 の最大 4 つのオークションを返します。
  • 結果をページングする

したがって、明らかに 2 つのカウンターを考慮する必要があります。1 つはカテゴリ内のオークション用で、もう 1 つはページング用です。

WITH Auctions AS
(
    SELECT  ROW_NUMBER() OVER 
    (PARTITION BY ItemCategoryID  ORDER BY AuctionID) AS AuctionNumber,                 
        AuctionID, 
        ItemCategoryID                             
        FROM Auctions                 
        WHERE                 
        AuctionStatus=1 
 ),
Paging as (
  SELECT ROW_NUMBER() OVER (ORDER BY ItemCategoryID, AuctionID) as RowNumber
   , a.* 
  FROM Auctions a  
  WHERE AuctionNumber <= 3 
)
SELECT * 
  FROM Paging 
  WHERE  RowNumber BETWEEN @StartRow AND @EndRow - 1;

パフォーマンスは悪くなる可能性がありますが、データ スキーマの知識 (テーブル定義、インデックスなど) がなければ、問題のステートメントに欠けているパフォーマンスを設計することはできません。

合計レコード数:

WITH Auctions AS
(
  SELECT  ROW_NUMBER() OVER 
    (PARTITION BY ItemCategoryID  ORDER BY AuctionID) AS AuctionNumber,                 
    AuctionID, 
    ItemCategoryID  ,                             
  FROM Auctions                 
  WHERE AuctionStatus=1 
)
SELECT @total = COUNT(*) 
 FROM Auctions a  
 WHERE AuctionNumber <= 3;
于 2012-09-12T07:12:07.147 に答える