열 이름 값 페이징
1 A 1 1
1 B 2 2
1 B 3 2
1 B 4 2
1 B 5 3
1 C 6 4
1 C 7 4
1 C 8 4
1 C 9 5
1 C 10 5
그리드가 3줄로 표시할수있는 페이지가 있는데 이름이 바뀌면 그냥 페이지를 넘겨서 처리하게끔 페이징을 표시하고싶습니다.
다음 이름값과 합쳐 3줄이 페이지 번호를 추가하는 식으로요...
이런식으로 뒤에 페이징 번호를 먹이고 싶습니다.
어떻게 해야 할까요 ㅠㅠ..
이렇게 사용하는이유는 위에말했다 싶히 딱 맞지 않고 페이지가 넘어가면 빈공간을 남기고 다른 페이지 처리를 하고 싶어하는것인데
혹시 sql말고 그리드로 해결할수있는 방안이 있을까요...
사용하던것중에 크리스탈레포트는 사용이 가능한데...
이게 배포가 힘들어서 될수있으면 사용을 안할려고합니다. ㅠㅠ
Comment 8
-
건우아빠
2013.08.16 19:04
-
뽀구
2013.08.19 12:06
건우아빠님 답변감사합니다. ㅠㅠ 제가 질문에 한가지 기능을 빼먹고했네요....
앞페이지 공간이 남아있으면 붙이는 기능이 필요한데.. 그기능을 안적었네요...
혹시 이러한 것에대한 답을 아시나요??
귀찮게 해드려서 죄송합니다.
-
건우아빠
2013.08.19 12:23
앞페이지 공간이 남아있으면 의미가 ?
이름이 다르면 다른 페이지라는 규칙에 맞지 않는듯 합니다.
무조건 3줄씩이 되지 않을까요? 이 내용이면 그냥 row_numer를 3.으로 나누값을 ceiling으로 묶으시면 페이지 번호를 만드실수 있습니다.
쿼리는 더 간단해 집니다. 위 쿼리를 단계별로 실행해 보시면 충분히 수정을 하실수 있을듯 합니다.
어떤식으로 나와야 하는지 표로 표현하시는게 좋을듯 합니다.
-
뽀구
2013.08.19 13:44
select 1 [열] ,'A'[이름] ,1 [값] union all 1페이 지
select 2 ,'B' ,2 union all 2페이지
select 3 ,'B' ,3 union all 2페이지
select 4 ,'B' ,4 union all 2페이지
select 5 ,'B' ,5 union all 3페이지
select 6 ,'C' ,6 union all 3페이지
select 7 ,'D' ,7 union all 4페이지
select 8 ,'D' ,8 union all 4페이지
select 9 ,'D' ,9 union all 4페이지
select 10 ,'D' ,10 5페이지 ) ,6번째 열을 보시면 이름C는 한칸밖에 없으므로 3페이지의 남은공간 (2열남음)에 들어갈수있기때문에
3페이지에 넣어집니다... D는 남은공간(1열)에 다 표시가 되지 않으므로 새로 한페이지를 만들구요.
한페이지에 여러명이 들어가도 상관이 없습니다.. 실제로는 30칸정도 될예정입니다.
제가 설명을 잘못드렸네요 ..
-
뽀구
2013.08.19 13:43
select 1 [열] ,'A'[이름] ,1 [값] union all 1페이 지
select 2 ,'B' ,2 union all 2페이지
select 3 ,'B' ,3 union all 2페이지
select 4 ,'B' ,4 union all 2페이지
select 5 ,'B' ,5 union all 3페이지
select 6 ,'C' ,6 union all 3페이지
select 7 ,'D' ,7 union all 4페이지
select 8 ,'D' ,8 union all 4페이지
select 9 ,'D' ,9 union all 4페이지
select 10 ,'D' ,10 5페이지 ) ,6번째 열을 보시면 이름C는 한칸밖에 없으므로 3페이지의 남은공간 (2열남음)에 들어갈수있기때문에
3페이지에 넣어집니다... D는 남은공간(1열)에 다 표시가 되지 않으므로 새로 한페이지를 만들구요.
한페이지에 여러명이 들어가도 상관이 없습니다.. 실제로는 30칸정도 될예정입니다.
제가 설명을 잘못드렸네요 ..
-
건우아빠
2013.08.19 13:52
음 첫번째는 왜 한줄만 나오는지?
상당히 난해해 질듯하네요 불길한예감 -
뽀구
2013.08.19 15:07
첫번째 페이지의 남은열이 2열에 4개를 전부 넣을수가 없어서요..
이렇게 사용하는이유는.. 서로같은이름을 가지면 잘라서 표현하지 않게 할려고하는겁니다.
하지만 하나만으로도 최대칸수를 넘어가면 어쩔수없이 잘라줘야되서요..
-
건우아빠
2013.08.19 16:58
이 부분 때문에 상당히 난해해 지네요...
쿼리보다는 프로시저로 만드시는게 쉽지 않을까 생각 됩니다.
with
data as (
select 1 [열] ,'A'[이름] ,1 [값] union all
select 1 ,'B' ,2 union all
select 1 ,'B' ,3 union all
select 1 ,'B' ,4 union all
select 1 ,'B' ,5 union all
select 1 ,'C' ,6 union all
select 1 ,'C' ,7 union all
select 1 ,'C' ,8 union all
select 1 ,'C' ,9 union all
select 1 ,'C' ,10 ) ,
res1 as
(
select *
, row_number() over( partition by [이름] order by [값]) f
, case when row_number() over( partition by [이름] order by [값]) % 3 = 1 then 1 else 0 end pidx
from data ) ,
res2 as
(
select a.열, a.이름 , a.값
, sum( isnull(b.pidx,1) ) page
, row_number() over( partition by sum( isnull(b.pidx,1) ) order by a.값 ) seq
from res1 a left join res1 b on a.[값] >= b.[값]
group by a.열, a.이름 ,a.값 )
-- select * from res1
-- select * from res2
select a.*
from ( select * from res2 a where a.page = 5 ) a
right join ( select 1 no union select 2 no union select 3 no ) p
on a.seq = p.no