Home | Print | Q/A | Guest | NewsLetter
Display context of search results Case-sensitive searching
RProgramming오타정정Oracle9.2.0.1초기화매개변수들확률분포함수인놈소개/2010-03-10 › 2차원배열형태의문제
Database System
Data Warehouse
Data Analysis
Operating System
Open Source
Enterprise Architecture
Software Engineering
Process
Working Smart

SQL Server
PostgreSQL
Oracle
DB2
Teradata
MySQL
Performance Tuning
Programming

Link
Philosophy
Tools
Misc
주인놈
_
_
SideBar Edit

Contents

1 문제
2 테스트 데이터
3 솔루션


1 문제 #

이런 테이블이 있다면...
       1열     2열    3열     4열
1행     A       B       C       D
2행     E       F       G       H
3행     I       J       K

매개변수로 5를 넣으면 다음과 같은 결과를 얻어야 한다. (셀 5개가 밀려야 한다.)

        1열     2열    3열     4열
1행                          
2행             A       B       C
3행     D       E       F       G
4행     H       I       J       K

2 테스트 데이터 #

--drop table #temp
create table #temp (
	seq int 
,	열1 varchar(20)
,	열2 varchar(20)
,	열3 varchar(20)
,	열4 varchar(20)
)

insert #temp values(1, 'a', 'b', 'c', 'd')
insert #temp values(2, 'e', 'f', 'g', 'h')
insert #temp values(3, 'i', 'j', 'k', null)

create table #dumy(seq int)
insert #dumy values(1)
insert #dumy values(2)
insert #dumy values(3)
insert #dumy values(4)
insert #dumy values(5)
insert #dumy values(6)
insert #dumy values(7)
insert #dumy values(8)
insert #dumy values(9)
insert #dumy values(10)
insert #dumy values(11)
insert #dumy values(12)
insert #dumy values(13)
insert #dumy values(14)
insert #dumy values(15)
insert #dumy values(16)
insert #dumy values(17)
insert #dumy values(18)
insert #dumy values(19)
insert #dumy values(20)

3 솔루션 #

declare 
	@col_cnt int
,	@set_num int
set @col_cnt = 4
set @set_num = 9 --요기에 시작할 곳 입력

select 
	isnull(min(case when b.cnt1 = a.seq then col end), '') 열1
,	isnull(min(case when b.cnt2 = a.seq then col end), '') 열2
,	isnull(min(case when b.cnt3 = a.seq then col end), '') 열3
,	isnull(min(case when b.cnt4 = a.seq then col end), '') 열4
from (
	select
		b.seq + (@col_cnt * (a.seq - 1)) +  @set_num - 1 seq
	,	case 
			when b.seq = 1 then 열1
			when b.seq = 2 then 열2
			when b.seq = 3 then 열3
			when b.seq = 4 then 열4
		end col
	from #temp a cross join #dumy b
	where b.seq <= @col_cnt) a right join (
					select 
						(b.seq * (@col_cnt)) - @col_cnt + 1 cnt1
					,	(b.seq * (@col_cnt)) - @col_cnt + 2 cnt2
					,	(b.seq * (@col_cnt)) - @col_cnt + 3 cnt3
					,	(b.seq * (@col_cnt)) - @col_cnt + 4 cnt4
					,	a.seq
					from #temp a right join #dumy b
					on a.seq + @set_num/@col_cnt = b.seq
					where (select count(*) from #temp) + @set_num/@col_cnt   >= b.seq) b	
on a.seq in (b.cnt1, b.cnt2, b.cnt3, b.cnt4)
group by b.cnt1

--결과셋을 적절히 Top으로 끊으면 된다.
/*
열1                   열2                   열3                   열4
-------------------- -------------------- -------------------- --------------------
                                                               
                                                               
a                    b                    c                    d
e                    f                    g                    h
i                    j                    k                    
*/

EditText|Print|FindPage|DeletePage|LikePages|http://www.databaser.net|last modified 2010-03-08 17:36:51