_대문 | 방명록 | 최근글 | 홈피소개 | 주인놈
FrontPage › 그룹의첫번째값만나타나게하기-또다른형태

Contents

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


1 문제 #

그룹의 첫 번째 값만 나타나게 하는 또 다른 형태의 문제다 원본 테이블은 다음과 같은 형태다. 내용을 보면 알겠지만 방명록과 댓글의 형태다.
p1.jpg

우리의 개발자는 다음과 같은 형태로 결과를 가져오기를 원했다. (필자는 원하는 결과집합이 이해가 가지 않아 한참 개발자와 덤앤 더머 놀이를 한참 동안이나 했던 기억이다.)
p2.jpg

2 테스트 데이터 #

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 
*/

3 솔루션 #

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, 댓글번호

댓글 남기기..
이름: : 오른쪽의 새로고침을 클릭해 주세요. 새로고침
EditText : Print : Mobile : FindPage : DeletePage : LikePages : Powered by MoniWiki : Last modified 2018-04-13 23:12:52

자기 자리의 중요성을 아는 사람은 절대로 외로움이나 쓸쓸함 따위를 느끼지 않는다. 나를 기억하고 있는 단 한 사람이라도 있다면 나를 필요로 하는 곳이 단 한 군데만이라도 있다면 그 사람은 매우 행복한 사람이 아닐까. 지금 이 자리의 자신으로부터 작지만 결코 작지 않은 새로운 역사가 시작되는 것이다. (안도현)