안녕하세요 SQL 관련하여 문의사항이 있어 이렇게 글을 올립니다.
10개의 데이터가 있습니다.
Index가 순차적으로 존재합니다.
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
이때 시작점을 넣어 아래와 같이 출력이 되는 방법이 있는지 궁금합니다.
원하는 출력은 아래와 같습니다.
4를 입력받았을 경우
4 d
5 e
6 f
7 g
8 h
9 i
10 j
1 a
2 b
3 c
과 같은 쿼리를 쓸수 있는지 궁금합니다.
고수 분들의 많은 도움 부탁드립니다.
Comment 4
-
건우아빠
2016.02.04 14:25
with res as(select 1 idx ,'a' txt union allselect 2 ,'b' union allselect 3 ,'c' union allselect 4 ,'d' union allselect 5 ,'e' union allselect 6 ,'f' union allselect 7 ,'g' union allselect 8 ,'h' union allselect 9 ,'i' union allselect 10 ,'j' )select *from resorder by case when idx < 4 then 2 else 1 end , idx -
이리
2016.02.04 14:37
UNION으로 해서 번호 이상인 결과 와 번호 미만인 결과를 보면 되지 않을까요
-
건우아빠
2016.02.04 15:03
index가 순차적으로 존재한다고 되어 있어서 문제가 없을듯합니다....중간에 index값이 뛰어도 문제될것... 속도 -
Terry
2016.02.04 14:49
건우아빠님 쿼리와 이리님의 덧글을 참고해서
작성되었습니다.
하기 쿼리 참고하세요~
---쿼리시작---
Declare @al_num Integer
Set @al_num = 4
;with res as
(
select 1 idx ,'a' txt union all
select 2 ,'b' union all
select 3 ,'c' union all
select 4 ,'d' union all
select 5 ,'e' union all
select 6 ,'f' union all
select 7 ,'g' union all
select 8 ,'h' union all
select 9 ,'i' union all
select 10 ,'j'
)
Select a.idx
,a.txt
,a.seq
From
(
select *
,ROW_NUMBER() over(order by idx) As seq
from res
where idx >= @al_num
union all
select a.idx
,a.txt
,ROW_NUMBER() over(order by idx) + ISNULL(b.cnt,0) As seq
from res a left outer join ( select COUNT(1) as cnt from res where idx>= @al_num ) b On 1=1
where idx < @al_num
) a
Order By a.seq Asc---쿼리끝---