2012-12-06 2 views
0

그룹화 된 데이터를 페이지 매김하고 싶지만 페이지 당 제한된 수의 행 (결과가 아님) 만 표시 할 수있는 제한이 있습니다.SQL에서 페이지가 매겨진 그룹화 된 데이터를 생성하는 방법

예를 들어, 20 개 행의 각 페이지에는 하나 이상의 결과 그룹이 표시됩니다.

여러 페이지 기 스팬의 결과는 '그룹 제목 경우 각 결과의 그룹 제목을

  • 행을 포함하는 행이 각 그룹으로 구성된다 '행이 다음 페이지에서 반복됩니다.

    지금까지 union 결과 및 그룹 제목은 페이지를 쉽게 열 수있는 행 테이블을 구성 할 수 있도록 정렬되었습니다. 나는 SQL에서 실종 무엇

    select * from (
    
        select f.Id, f.Name, p.Id As ProviderId, 2 as RowType, 
         'Result' as RowTypeTitle 
        from Fund f 
        inner join Provider p on f.ProviderId = p.Id 
    
        union 
    
        select distinct f2.ProviderId as Id, p2.Name, f2.ProviderId, 1 as RowType, 
         'Group Title' as RowTypeTitle 
        from Fund f2 
        inner join Provider p2 on f2.ProviderId = p2.Id 
    
    ) u 
    
    order by u.ProviderId, u.RowType asc 
    

    위의 예를 들어 내가 페이지 당 20 '행'을 반환해야 중복 '그룹 제목'행입니다. 어떻게 SQL을 리팩터링하여 이들을 통합 할 수 있습니까?

  • 답변

    0

    함수 ROW_NUMBER를 사용하면 여러 행을 생성 할 수 있습니다. 그런 다음 당신은 당신이 어디에 있는지 계산합니다.

    Idealy를 사용하면 "With"절을 사용하여 구문을 단순화 할 수 있습니다. 그러나 여기에 귀하의 질문에 대한 코드가 있습니다.

    예 :

    SELECT * FROM 
        (select ROW_NUMBER() over(order by t.ProviderId, t.RowType)/20 AS PageID ,* 
        from (
    
         select * from (
    
          select f.Id, f.Name, p.Id As ProviderId, 2 as RowType, 
            'Result' as RowTypeTitle 
          from Fund f 
          inner join Provider p on f.ProviderId = p.Id 
    
         union 
    
          select distinct f2.ProviderId as Id, p2.Name, f2.ProviderId, 1 as RowType, 
           'Group Title' as RowTypeTitle 
          from Fund f2 
          inner join Provider p2 on f2.ProviderId = p2.Id)y) t 
         )u 
    
    
         order by u.ProviderId, u.RowType asc 
    

    는 그런 다음 "페이지 id는"한 번에 데이터 (20)를 넣어 느릅 나무 페이지에 당신을 말할 것이다.

    +0

    나는 이것을 실행했으며 그룹화 된 'rowid'열을 추가하는 것으로 보입니다. 이건 내가 진짜로 한 일이 아니야. 그룹 제목 행을 20 행마다 추가하고 각 그룹의 시작 부분에 결과를 그룹화해야합니다. – Digbyswift

    +0

    테이블 정의 및 데이터가 없기 때문에 havent는 정확히 쿼리를 시도했습니다. ROW_NUMBER를 사용하면 가지고있는 행 수에 따라 0에서 99999까지의 ROWID를 가질 수 있습니다. 그렇지 않다면 "PARTITION BY"를 바꾸면 작동하는 것을 볼 수 있습니다. 그런 다음, "where u.ROW_ID between 0 and 20"을 20과 40 사이에서 변경합니다. –

    +0

    스키마는 기금과 제공자 간의 직접적인 관계와 일대일 관계이므로 쉽게 설정할 수 있어야합니다. 귀하의 스크립트를 실행하고 그것은 내가 질문에 무엇을 요구하지 않습니다. 또한 답안에서 제시해야 할 것을하지 않습니다. – Digbyswift

    관련 문제