#title 그룹의 첫 번째 값만 나타나게 하기 - 또 다른 형태 [[TableOfContents]] ==== 문제 ==== 그룹의 첫 번째 값만 나타나게 하는 또 다른 형태의 문제다 원본 테이블은 다음과 같은 형태다. 내용을 보면 알겠지만 방명록과 댓글의 형태다. attachment:p1.jpg 우리의 개발자는 다음과 같은 형태로 결과를 가져오기를 원했다. (필자는 원하는 결과집합이 이해가 가지 않아 한참 개발자와 덤앤 더머 놀이를 한참 동안이나 했던 기억이다.) attachment:p2.jpg ==== 테스트 데이터 ==== {{{ use tempdb go --drop table 방명록 --drop table 방명록댓글 create table 방명록( 홈피번호 int , 방명록글번호 int , 방명록내용 nvarchar(500) ) create table 방명록댓글( 방명록글번호 int , 댓글번호 int , 댓글 nvarchar(200) ) insert 방명록 values(1,1, '아~머여1'); insert 방명록 values(1,2, '아~머여2'); insert 방명록 values(1,3, '아~머여3'); insert 방명록 values(1,4, '아~머여4'); insert 방명록 values(2,5, '아~머여4'); insert 방명록댓글 values(1, 1, '머가1') insert 방명록댓글 values(1, 2, '머가1') insert 방명록댓글 values(2, 3, '머가2') insert 방명록댓글 values(2, 4, '머가2') insert 방명록댓글 values(2, 5, '머가2') insert 방명록댓글 values(2, 6, '머가2') insert 방명록댓글 values(3, 7, '머가3') select * from 방명록 select * from 방명록댓글 /* 목표 결과집합 방명록글번호 방명록내용 댓글번호 댓글내용 4 아~머여4 null null 3 아~머여3 null null 3 null 7 머가3 2 아~머여2 null null 2 null 6 머가2 2 null 5 머가2 2 null 4 머가2 2 null 3 머가2 1 아~머여1 null null */ }}} ==== 솔루션 ==== {{{ select 방명록글번호 , case when 순번 >= 2 then '' else 방명록내용 end 방명록내용 , 댓글번호 , 댓글 from ( select 방명록글번호 , 방명록내용 , 댓글번호 , 댓글 , row_number() over(partition by 방명록글번호 order by 방명록글번호 desc) 순번 from ( select a.방명록글번호2 방명록글번호 , a.방명록내용 , b.댓글번호 , b.댓글 from ( select case when 구분=2 then 방명록글번호 end 방명록글번호1 , 방명록글번호 방명록글번호2 , 방명록내용 , 구분 from 방명록 cross join (select 1 구분 union all select 2) t where 방명록.홈피번호 = 1 ) a left outer join 방명록댓글 b on a.방명록글번호1 = b.방명록글번호 group by a.방명록글번호2 , a.방명록내용 , b.댓글번호 , b.댓글 ) t ) t order by 방명록글번호 DESC, 댓글번호 }}} NULL을 없애고 싶다면... {{{ select 방명록글번호 , isnull(case when 순번 >= 2 then '' else 방명록내용 end, '') 방명록내용 , isnull(댓글번호, '') 댓글번호 , isnull(댓글, '') 댓글 from ( select 방명록글번호 , 방명록내용 , 댓글번호 , 댓글 , row_number() over(partition by 방명록글번호 order by 방명록글번호 desc) 순번 from ( select a.방명록글번호2 방명록글번호 , a.방명록내용 , b.댓글번호 , b.댓글 from ( select case when 구분=2 then 방명록글번호 end 방명록글번호1 , 방명록글번호 방명록글번호2 , 방명록내용 , 구분 from 방명록 cross join (select 1 구분 union all select 2) t where 방명록.홈피번호 = 1 ) a left outer join 방명록댓글 b on a.방명록글번호1 = b.방명록글번호 group by a.방명록글번호2 , a.방명록내용 , b.댓글번호 , b.댓글 ) t ) t order by 방명록글번호 DESC, 댓글번호 }}}