2013-04-27 5 views
0

SQL 스크립트를 작성하려고하지만 예기치 않은 결과가 발생합니다. @TotalResults는 33 개의 레코드가 반환되었음을 알 때 레코드 6 개를 제공합니다.SQL에서 페이지 매기기 및 그룹화

SELECT @TotalPages = CEILING(COUNT(a.MemberID)/@PageSize), @TotalResults = COUNT(a.MemberID) 
FROM Member a 
INNER JOIN MemberBusinessCat b ON b.MemberID = a.MemberID 
INNER JOIN BusinessCat c ON c.BusinessCatID = b.BusinessCatID 
WHERE a.SystemID = @SystemID 
AND c.CategoryName LIKE '%' + @SearchStr + '%' 
AND (@ShowUnclaimed != 'N' 
    OR (a.Claimed = 'Y' AND a.SBIcon = 'N') 
) 
AND a.Viewable = 'Y' 
GROUP BY a.MemberID, a.CreateDate, a.UserName, a.PrCity, a.MemberDisplayName, a.PrStateID, a.PrPhone, a.ShortDesc, a.PrCountryID; 

WITH CoalPrepCategorySearch AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY a.MemberDisplayName ASC) AS RowNum, 
    a.MemberID, 
    a.UserName, 
    a.PrCity, 
    a.PrStateID, 
    a.PrPhone, 
    @TotalPages AS TotalPages, 
    a.MemberDisplayName AS DisplayName, 
    a.ShortDesc, 
    @TotalResults AS TotalResults, 
    a.PrCountryID 
    FROM Member a 
    INNER JOIN MemberBusinessCat b ON b.MemberID = a.MemberID 
    INNER JOIN BusinessCat c ON c.BusinessCatID = b.BusinessCatID 
    WHERE a.SystemID = @SystemID 
    AND c.CategoryName LIKE '%' + @SearchStr + '%' 
    AND (@ShowUnclaimed != 'N' 
     OR (a.Claimed = 'Y' AND a.SBIcon = 'N') 
    ) 
    AND a.Viewable = 'Y' 
    GROUP BY a.MemberID, a.CreateDate, a.UserName, a.PrCity, a.MemberDisplayName, a.PrStateID, a.PrPhone, a.ShortDesc, a.PrCountryID 
) 
SELECT * 
FROM CoalPrepCategorySearch 
WHERE RowNum BETWEEN (@PG - 1) * @PageSize + 1 AND @PG * @PageSize 
ORDER BY DisplayName ASC 

내가이 그룹과 관련이 확신 :

여기에 코드입니다. 그렇다면 전체 결과를 어떻게 얻을 수 있습니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

미리 감사드립니다.

답변

2

가능한 neojakey하면이 당신을 위해 도움이 될 수 -

;WITH cte AS 
(
    SELECT a.* 
    FROM dbo.Member a 
    JOIN dbo.MemberBusinessCat b ON b.MemberID = a.MemberID 
    JOIN dbo.BusinessCat c ON c.BusinessCatID = b.BusinessCatID 
    WHERE a.SystemID = @SystemID 
     AND c.CategoryName LIKE '%' + @SearchStr + '%' 
     AND a.Viewable = 'Y' 
     AND (
        @ShowUnclaimed != 'N' 
       OR 
        a.Claimed + a.SBIcon = 'YN' 
     ) 
), CoalPrepCategorySearch AS 
(
    SELECT 
     ROW_NUMBER() OVER(ORDER BY a.MemberDisplayName ASC) AS RowNum, 
     a.MemberID, 
     a.UserName, 
     a.PrCity, 
     a.PrStateID, 
     a.PrPhone, 
     a.MemberDisplayName AS DisplayName, 
     a.ShortDesc, 
     a.PrCountryID 
    FROM (
     SELECT DISTINCT 
      a.MemberDisplayName, 
      a.MemberID, 
      a.UserName, 
      a.PrCity, 
      a.PrStateID, 
      a.PrPhone, 
      a.ShortDesc, 
      a.PrCountryID 
     FROM cte a 
    ) a 
) 
SELECT * 
FROM CoalPrepCategorySearch t 
CROSS JOIN (
    SELECT 
      TotalPages = CEILING(COUNT(t2.MemberID)/@PageSize) 
     , TotalResults = COUNT(t2.MemberID) 
    FROM cte t2 
    GROUP BY t2.MemberID 
) t2 
WHERE RowNum BETWEEN (@PG - 1) * @PageSize + 1 AND @PG * @PageSize --?? 
ORDER BY t.DisplayName