혼자 짜보려고 애쓰다 포기하고 질문 드립니다....
그림을 대충 그린점 양해바랍니다..
T1, T2, T3, ... ~ T7은 각각 테이블 이름이구여
T1의 DOCNUM과 값이 같은 데이터를 T2, T3 ~ T7에서 가져옵니다.
근데 T2 ~ T7 까지 DOCNUM에 맞는 값이 한개가 될수있고 없을수도 있고 여러개가 있을수도 있는거고
데이터가 제일 많은 테이블을 기준으로 행이 늘어납니다.
그림처럼 T1은 공통 부분이라 처음 한번만 출력되고 나머지는 공백이며, T2는 4개 T3는 2개의 데이터가 있지만 T2가 4개니까 4줄이 출력된겁니다.
없는 데이터만큼은 공백이 출력되구여( T3 2줄은 공백)
#은 고유 번호가 아닌 단순히 순번을 부여한 것이고 테이블엔 없는 칼럼입니다.
#2의 경우는 공통 값만 입력되고 나머지는 데이터가 없어서 한줄만 출력된거구요
프로시저로 짜고 있는데
조인을해면 곱연산으로 행이 출력되고
갈피를 못잡겠네요... 도움좀 부탁드립니다
Comment 2
-
Terry
2015.12.09 17:02
-
건우아빠
2015.12.09 17:09
조인으로 하실려면 full join 할수 밖에 없을듯 합니다...
각 테이블 조회시 코드별 seq를 row_number() 를 이용해서 만드시는게 중요...
이련 경우는 간단하게 union 으로 각테이블 값을 붙인다음 작업을 하시는게 쉽습니다.
물론 각테이블의 코드별 로우수를 부여하고 이걸 가지고 조인을 하실수도 있구요..... full join
with
t1 as(
select 'c001' code ,'a' name, '' date ,'' stat union all
select 'c002' code ,'zam' name, '' date ,'' stat union all
select 'c003' code ,'' name, '' date ,'' stat ) ,
t2 as(
select 'c001' code ,'a' [server], '' ip ,'' [file] union all
select 'c001' code ,'b' server, '' ip ,'' [file] union all
select 'c001' code ,'c' server, '' ip ,'' [file] union all
select 'c001' code ,'d' server, '' ip ,'' [file] ) ,
t3 as(
select 'c001' code ,'12' aa, '' bb ,'' cc union all
select 'c001' code ,'12' aa, '' bb ,'' cc ) ,
res as (
select code , name ,date , stat , '' [server] ,'' ip,'' [file] , '' aa, '' bb , '' cc , ROW_NUMBER() over (partition by code order by name ) seq
from t1
union all
select code , ''name ,'' date , '' stat , [server] , ip, [file] , '' aa, '' bb , '' cc, ROW_NUMBER() over (partition by code order by server ) seq
from t2
union all
select code , ''name ,'' date , '' stat , '' [server] ,'' ip,'' [file] , aa, bb , cc, ROW_NUMBER() over (partition by code order by aa ) seq
from t3)
select code
, max(name) [name]
, max(date) [date]
, max(stat) [stat]
, max(server) [server]
, max(ip) [ip]
, max([file]) [file]
, max(aa) [aa]
, max(bb) [bb]
, max(cc) [cc]
from res
group by code, seq
order by code, seq
샘플 데이터도 없는 상태로..최종 결과물 값만으로 억지로..비슷하게(?)
쿼리를 짜보았네요..
근데 docnum만 가지고 join 이 된다는게 뭔가 좀....-_-;;;
각 테이블마다 상세 join 조건들이 있을듯한데..
참고만 하세요..
(참고용으로도 못쓸 가능성 200% -_-;;;)
---쿼리시작---
;with t1(docnum,code,name,date,stat) As
(
Select '1','c001','a','','' union all
Select '2','c002','zam','','' union all
Select '3','c003','','',''
)
,t2 (docnum,code,server,ip,file2) As
(
Select '1','c001','a','','' union all
Select '1','c001','b','','' union all
Select '1','c001','c','','' union all
Select '1','c001','d','',''
)
,t3 (docnum,aa,bb,cc) As
(
Select '1','12','','' union all
Select '1','12','',''
)
Select
a.docnum as ori_docnum
,(
Case When a.rn = 1 Then a.docnum
Else (Case When IsNull(LAG(a.docnum, 1, 1) OVER (ORDER BY a.docnum),null) = a.docnum Then null
Else a.docnum
end
)
End
) As docnum
,(
Case When IsNull(LAG(a.code, 1, 1) OVER (Partition By a.code ORDER BY a.code),a.code) = a.code Then null
Else a.code
end
) As code
,(
Case When IsNull(LAG(a.name, 1, 1) OVER (Partition By a.name ORDER BY a.name),a.name) = a.name Then null
Else a.name
end
) As name
,(
Case When IsNull(LAG(a.date, 1, 1) OVER (Partition By a.date ORDER BY a.date),a.date) = a.date Then null
Else a.date
end
) As date
,(
Case When IsNull(LAG(a.stat, 1, 1) OVER (Partition By a.stat ORDER BY a.stat),a.stat) = a.stat Then null
Else a.stat
end
) As stat
,(
Case When IsNull(LAG(a.server, 1, 1) OVER (Partition By a.server ORDER BY a.server),a.server) = a.server Then null
Else a.server
end
) As server
,(
Case When IsNull(LAG(a.ip, 1, 1) OVER (Partition By a.ip ORDER BY a.ip),a.ip) = a.ip Then null
Else a.ip
end
) As ip
,(
Case When IsNull(LAG(a.file2, 1, 1) OVER (Partition By a.file2 ORDER BY a.file2),a.file2) = a.file2 Then null
Else a.file2
end
) As file2
,(
Case When IsNull(LAG(a.aa, 1, 1) OVER (Partition By a.aa ORDER BY a.aa),a.aa) = a.aa Then null
Else a.aa
end
) As aa
,(
Case When IsNull(LAG(a.bb, 1, 1) OVER (Partition By a.bb ORDER BY a.bb),a.bb) = a.bb Then null
Else a.bb
end
) As bb
,(
Case When IsNull(LAG(a.cc, 1, 1) OVER (Partition By a.cc ORDER BY a.cc),a.cc) = a.cc Then null
Else a.cc
end
) As cc
From
(
Select row_number() over(partition by a.docnum order by a.docnum) as rn
,row_number() over(order by a.docnum) as seq
,a.docnum
,a.code
,a.name
,a.date
,a.stat
,b.server
,b.ip
,b.file2
,b.aa
,b.bb
,b.cc
From t1 a Left Outer Join
(
Select
x.docnum
,x.server
,x.ip
,x.file2
,y.aa
,y.bb
,y.cc
From t2 x Left Outer Join t3 y On x.docnum = y.docnum
Group By x.docnum
,x.server
,x.ip
,x.file2
,y.aa
,y.bb
,y.cc
) b On a.docnum = b.docnum
) a
Order By a.seq asc
---쿼리끝---