【问题标题】:Row-Number in Between Sub Query子查询之间的行号
【发布时间】:2013-09-09 11:27:27
【问题描述】:
select 
   row_number() over (order by BookTitle) AS Row,
   BookTitleID, 
   BookTitle,
   CallNumber,
   FullName,
   count(case Status when 'OnShelf' then 1 else null end) AS CopiesOnShelves

from
(  
select 
       Book.BookTitleID,
       BookTitles.BookTitle,
       BookTitles.CallNumber,
       Book.Status,
       FullName = LastName + ', ' + FirstName + ' ' + MiddleName

From
    Book
        left outer join 
    BookTitles
        on BookTitles.BookTitleID = Book.BookTitleID 
        left outer join
    Authors
        on Authors.AuthorID = BookTitles.AuthorID   ) sub
Where Row between 1 and 10 -- not working
Group By Callnumber, BookTitle, BookTitleID, FullName

我将如何在此示例中使用 In between ROW 来显示第 1 行到第 10 行。

【问题讨论】:

    标签: tsql sql-server-2008-r2


    【解决方案1】:
    select * from(
    select 
       Row,
       BookTitleID, 
       BookTitle,
       CallNumber,
       FullName,
       CopiesOnShelves
    from
    (  
    select 
           Book.BookTitleID,
           BookTitles.BookTitle,
           BookTitles.CallNumber,
           FullName = LastName + ', ' + FirstName + ' ' + MiddleName,
           CopiesOnShelves = count(case Status when 'OnShelf' then 1 else null end),  
           Row = row_number() over (order by BookTitle)  
    From
        Book
            left outer join 
        BookTitles
            on BookTitles.BookTitleID = Book.BookTitleID 
            left outer join
        Authors
            on Authors.AuthorID = BookTitles.AuthorID   
    
     Group By Book.BookTitleID, BookTitles.BookTitle, BookTitles.CallNumber, 
        LastName, FirstName, MiddleName
    ) sub
    ) sub2
    WHERE Row between @start and @end
    

    【讨论】:

      【解决方案2】:

      您的 row_Number 函数需要在子查询中。您不能在声明它的查询的 where 子句中引用 row_number 列。您可以从外部查询。只是那些奇怪的 TSQL 规则之一。我不确定你是否真的想要选择结果中的行,所以我还是把它扔在那里。

      select 
         Row,
         BookTitleID, 
         BookTitle,
         CallNumber,
         FullName,
         count(case Status when 'OnShelf' then 1 else null end) AS CopiesOnShelves
      
      from
      (  
      select 
             Book.BookTitleID,
             BookTitles.BookTitle,
             BookTitles.CallNumber,
             Book.Status,
             FullName = LastName + ', ' + FirstName + ' ' + MiddleName,
             row_number() over (order by BookTitle) AS Row
      
      From
          Book
              left outer join 
          BookTitles
              on BookTitles.BookTitleID = Book.BookTitleID 
              left outer join
          Authors
              on Authors.AuthorID = BookTitles.AuthorID   ) sub
      Where Row between 1 and 10 -- not working
      Group By Callnumber, BookTitle, BookTitleID, FullName, Row
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多