database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 4655 게시물 읽기
No. 4655
이런 쿼리가 가능할까요
작성자
초보
작성일
2009-02-28 11:12
조회수
7,629

테이블이 두개가 있습니다.

마스터 테이블 과 기술 테이블이라고 합니다.
구조는

* 마스터 테이블

일련번호           사업명                    담당자이름            <--필드이름
1                        의류판매                      홍길동
2                         헤어샵                        슈퍼맨
3                         IT기술                         배트맨

* 기술 테이블

일련번호          기술코드           기술명
2                     T-001                 스트레이트파마
2                     T-002                       컷트
1                     C-005                    제단기술
3                     I-008                      C언어

 이런식으로 데이터가 들어가 있습니다.
 기술 테이블 일련번호를 INSERT시킬때 는 마스터 테이블의 일련번호를 가져옵니다.
 이걸 조인을 묶습니다.
 그러면
 아래와 같이 나오겠죠...

 일련번호          사업명         담당자이름            기술코드      기술명

1                     의류판매          홍길동                   C-005         제단기술
2                     헤어샵             슈퍼맨                   T-001     스트레이트 파마
2                     헤어샵             슈퍼맨                   T-002            컷트
3                     IT기술              배트맨                   I-008           C언어

 

쿼리문은
SELECT A.*,B.*

FROM   마스터 테이블 A, 기술테이블 B

where   A.일련번호  =  B.일련번호


이런식으로 나타날 수 있죠
그런데 여기서 문제가 있습니다.

위의 데이타중 사업명이 헤어샵부분은 2개가 들어가 있습니다.(일련번호 2번)
이렇게 나오면 안된다고 합니다.(아 짜증나)
아래와 같이 나와야 한다고 합니다.
일련번호             사업명        담당자이름        기술코드1      기술코드2    기술명1          기술명2
1                          의류판매          홍길동              C-005                            제단기술
2                         헤어샵             슈퍼맨               T-001          T-002      스트레이트파마    컷트
3                           IT기술            배트맨               I-008                                C언어

한마디로 만약 데이터가 한사업명에 기술부분이 1개이상일때 밑으로 계속 뿌려지는게 아니라
오른쪽에서  기술명1,2,3,4.... 이 추가되어 뿌려달라고 하는 것입니다.
 이게 쿼리에서 가능할까요???
기술부분은 한사업에 3개까지 가능합니다.
 도와주세요~~~~


Create Table tblBiz
(
일련번호 int
,사업명 varchar(50)
,담당자이름 varchar(50)          
)

Create Table tblTech
(
일련번호 int
,기술코드 varchar(50)
,기술명 varchar(50)          
)

insert tblBiz
Select 1, '의류판매', '홍길동' union all
Select 2, '헤어샵', '슈퍼맨' union all
Select 3, 'IT기술', '배트맨'

insert tblTech
Select 2, 'T-001', '스트레이트파마' union all
Select 2, 'T-002', '컷트' union all
Select 1, 'C-005', '제단기술' union all
Select 3, 'I-008', ' C언어'


이 글에 대한 댓글이 총 2건 있습니다.

음 어렵군요. .... 
3가지 기술을 반영해 레코드 하나더 추가. (설계상 정규화가 안되어 있는 문제이기는 한데요.)
Over를 이용해 어케든 해결되는 군요. ^^;

With  tbl AS
(
  SELECT
             a.일련번호, a.사업명, a.담당자이름, b.기술코드, b.기술명
             , iCount = ROW_NUMBER() OVER(PARTITION BY a.사업명 ORDER BY 기술코드)
  FROM
   tblBiz a  JOIN  tblTech b  ON A.일련번호 = B.일련번호
)
SELECT
         일련번호, 사업명, 담당자이름
       , 기술코드1 = MAX(CASE WHEN iCount = 1 THEN 기술코드 ELSE NULL END)
       , 기술코드2 = MAX(CASE WHEN iCount = 2 THEN 기술코드 ELSE NULL END)
       , 기술코드3 = MAX(CASE WHEN iCount = 3 THEN 기술코드 ELSE NULL END)
       , 기술명1  = MAX(CASE WHEN iCount = 1 THEN 기술명 ELSE NULL END)
       , 기술명2  = MAX(CASE WHEN iCount = 2 THEN 기술명 ELSE NULL END)
       , 기술명3  = MAX(CASE WHEN iCount = 3 THEN 기술명 ELSE NULL END)
FROM
 tbl
GROUP BY 일련번호, 사업명, 담당자이름


결과>

일련번호 사업명     담당자이름 기술코드1 기술코드2 기술코드3 기술명1          기술명2 기술명3
---------------------------------------------------------------------------------------
1            의류판매 홍길동       C-005       NULL        NULL     제단기술          NULL   NULL
2            헤어샵    슈퍼맨       T-001       T-002        T-003     스트레이트파마 컷트    면도
3            IT기술    배트맨        I-008        NULL        NULL     C언어              NULL  NULL
김호범(trueccie)님이 2009-03-01 15:01에 작성한 댓글입니다.
이 댓글은 2009-03-01 15:11에 마지막으로 수정되었습니다.

 일련 번호를 이용해서 그룹핑을 하면 되겠군요.


자세한 쿼리는 생각해 보시고....^^;;;


대략적인 해결책은 아래와 같이 될수 있을것 같습니다.


--


SELECT A.*,B.*

FROM   마스터 테이블 A, 기술테이블 B

where   A.일련번호  =  B.일련번호

--

이렇게 뽑아내게 되면, 기술 번호가 밑으로 가게 되겠지요, 그런데 동일한 리턴 테이블을 다른 더미 테이블을 만들어서 몇개를 더 만들어 내면 어떻게 될까요?


예를 들어 .


select a.*, b.* ,case c.num=1 then b.기술코드 else null 기술코드1,  case c.num=1 then b.기술코드 else null 기술코드2.....

from (

SELECT A.*,B.*

FROM   마스터 테이블 A, 기술테이블 B

where   A.일련번호  =  B.일련번호

)as t1, num

where num_int <=3.


num table은 1,2,3,4,,..등등과 같이 숫자 칼럼이며, 3보다 같거나 작은 수까지만 카테시안 곱을 만들어 냅니다.

따라서 리턴된 테이블과 똑 같은 결과를 3번 반복해서 출력 한다는거죠, 달라지는건 num의 num_int컬럼 뿐입니다.


그 num_int칼럼을 이용하여, 컬럼을 가로로 정렬하면 아래와 같이 되겠죠..


일련번호   사업명,.... 기술코드1    기술코드2....

....

2             헤어샵        T-001         NULL

2             헤어샵        NULL          T-002

....

...


위의 테이블을 다시 사업명으로 group by시키면서 각 max(기술코드N)을 연산 하게 되면.


2  헤어샵 T-001   T-002 ...

이런식으로 합쳐지게 됩니다.


물론 기술코드3이 없는 것들은  기술코드 3 부분은 계속 NULL로 나오게 되겠지요.


그럼 도움 되셨길 바랍니다.


P.s:다 쓰고 보니까 김호범님이 쓰신거랑, 내용은 같은거 같네요...^^;;

lnx4u님이 2009-03-06 14:22에 작성한 댓글입니다.
이 댓글은 2009-03-06 14:24에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
4658MS-SQL 2000 쿼리 질문 (재귀?) [5]
우세연
2009-03-04
8887
4657날짜형 변환 1시간단위 변경은? [3]
최덕현
2009-03-02
9286
4656도움을 부탁드립니다. [1]
조명희
2009-02-28
6096
4655이런 쿼리가 가능할까요 [2]
초보
2009-02-28
7629
4654MySQL에서 MSSQL 2005 변환시 궁금한점 [3]
미운오리
2009-02-26
7174
4653문자열을 이렇게 추출하고 싶어요 [1]
청개구리
2009-02-25
7154
4652MSSQL 데이터베이스 접속 허용수 [1]
미스터황
2009-02-25
7640
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다