세로 데이터를 가로로.... 0 7 2,118

by 허접탱이 [SQL Query] [2015.09.10 09:44:35]


안녕하세요. 

세로 데이터를 가로로 조회될 수 있도록 쿼리를 작성하는데.. 감이 안나와서..질문을 드립니다.

예를 들어 테이블 "A"가 있습니다.

이 테이블에는 직원정보, Seq No, 내용1, 내용2 이런식으로 구성이 되어 있습니다.

지금 현재 직원 정보로 조회를 하게 되면 아래와 같이 조회가 됩니다.

직원정보 SEQ NO 내용1 내용2
이순신 1 테스트1 테스트2
이순신 2 놀러가자 어디로
이순신 3 테스트1 테스트3

이렇게 조회 되는걸 아래 처럼 조회를 하고 싶습니다.

최대로 10개까지만 조회가 되며 조회된 데이터는 직원정보기준으로 가로로 쭉 조회되게 하고 싶습니다.

직원정보 SEQ NO 내용1 내용2 SEQ NO 내용1 내용2 SEQ NO 내용1 내용2
이순신 1 테스트1 테스트2 2 놀러가자 어디로 3 테스트1 테스트3

위의 표와 같이 표시를 해주고 싶으며, 보시는바와 같이 내용은 같은수도 있고 다를수도 있으며,

SEQ NO는 유니크한 숫자입니다

 

매번 도움만 요청을 드려 민망하네요..^^;; 환절기 건강 유의하시고.. 즐건 하루 되세요..^^

by 아발란체 [2015.09.10 10:01:24]
WITH T(직원정보, seqno, 내용1, 내용2) AS (
  SELECT '이순신', 1, '테스트1', '테스트2' FROM DUAL
  UNION ALL SELECT '이순신', 2, '놀러가자', '어디로' FROM DUAL
  UNION ALL SELECT '이순신', 3, '테스트1', '테스트3' FROM DUAL
  UNION ALL SELECT '이순신2', 1, '테스트1', '테스트2' FROM DUAL
  UNION ALL SELECT '이순신2', 2, '놀러가자', '어디로' FROM DUAL
)
SELECT
  직원정보,
  MAX(seqno1), MAX(내용1_1), MAX(내용1_2),
  MAX(seqno2), MAX(내용2_1), MAX(내용2_2),
  MAX(seqno3), MAX(내용3_1), MAX(내용3_2)
FROM (
  SELECT
    직원정보,
    seqno AS seqno1, 
    DECODE(seqno, 1, 내용1) AS 내용1_1,
    DECODE(seqno, 1, 내용2) AS 내용1_2,
    seqno AS seqno2, 
    DECODE(seqno, 2, 내용1) AS 내용2_1,
    DECODE(seqno, 2, 내용2) AS 내용2_2,
    seqno AS seqno3, 
    DECODE(seqno, 3, 내용1) AS 내용3_1,
    DECODE(seqno, 3, 내용2) AS 내용3_2
  FROM
    T
)
WHERE
  seqno1 IS NOT NULL
  AND seqno2 IS NOT NULL
  AND seqno3 IS NOT NULL
GROUP BY
  직원정보  

 


by 허접탱이 [2015.09.10 10:53:23]

아발란체님.. 우선 답변 감사합니다.

근데.. 한가지 궁금한 점이 있습니다. 제가 설명을 할때 seq no를 한자리로 표현을 했는데..실제 들어가 있는 데이터는 "년월일+seq(6자리)"의 형태(ex : 20150910000001)로 되어있는 문자열입니다.

이럴경우 어떻게 해야할까요? 

그리고 작성해주신 쿼리를 실행해보면 seqno는 다 동일하게 표시가 되는거 같습니다. 어디 부분을 수정하면 제가 원하는 데이터를 얻을수있을까요? ^^;;


by 아발란체 [2015.09.10 11:13:24]
-- 수정해서 드립니다 ~ :)

WITH T(직원정보, seqno, 내용1, 내용2) AS (
  SELECT '이순신', '20150910000001', '테스트1', '테스트2' FROM DUAL
  UNION ALL SELECT '이순신', '20150910000002', '놀러가자', '어디로' FROM DUAL
  UNION ALL SELECT '이순신', '20150910000003', '테스트1', '테스트3' FROM DUAL
  UNION ALL SELECT '이순신2', '20150910000001', '테스트1', '테스트2' FROM DUAL
  UNION ALL SELECT '이순신2', '20150910000002', '놀러가자', '어디로' FROM DUAL
)
SELECT
  직원정보,
  MAX(seqno1), MAX(내용1_1), MAX(내용1_2),
  MAX(seqno2), MAX(내용2_1), MAX(내용2_2),
  MAX(seqno3), MAX(내용3_1), MAX(내용3_2)
FROM (
  SELECT
    직원정보,
    DECODE(seqno, '20150910000001', seqno) AS seqno1, 
    DECODE(seqno, '20150910000001', 내용1) AS 내용1_1,
    DECODE(seqno, '20150910000001', 내용2) AS 내용1_2,
    DECODE(seqno, '20150910000002', seqno) AS seqno2, 
    DECODE(seqno, '20150910000002', 내용1) AS 내용2_1,
    DECODE(seqno, '20150910000002', 내용2) AS 내용2_2,
    DECODE(seqno, '20150910000003', seqno) AS seqno3, 
    DECODE(seqno, '20150910000003', 내용1) AS 내용3_1,
    DECODE(seqno, '20150910000003', 내용2) AS 내용3_2
  FROM
    T
)
GROUP BY
  직원정보  
;

 


by 허접탱이 [2015.09.10 11:27:42]

아발란체님.. 

제가 질문을 좀 이상하게 드린거같네요.. ㅠㅠ

제가 궁금한건 중간부분의 DECODE할때...지금 현재는 seqno를 하드코딩을 해서 넣으셨는데..

그부분을 하드 코딩이 아닌(어떤 데이터가 들어갈지 모릅니다.) 방법으로 구해올수 있는 방법은 없을까요? 


by jkson [2015.09.10 11:38:41]

seq가 조회시에 3개만 나오는 게 아닌가보네요? 열이 옆으로 계속 확장되게 하려면 동적 쿼리 쓰셔야 하고 한정 되어있다면

--아발란체님  꺼 좀 수정했어요

WITH T(직원정보, SEQNO, 내용1, 내용2) AS (
  SELECT '이순신', '20150910000001', '테스트1', '테스트2' FROM DUAL
  UNION ALL SELECT '이순신', '20150910000002', '놀러가자', '어디로' FROM DUAL
  UNION ALL SELECT '이순신', '20150910000003', '테스트1', '테스트3' FROM DUAL
  UNION ALL SELECT '이순신2', '20151010000001', '테스트1', '테스트2' FROM DUAL
  UNION ALL SELECT '이순신2', '20151010000001', '놀러가자', '어디로' FROM DUAL
)
SELECT
  직원정보,
  MAX(SEQNO1), MAX(내용1_1), MAX(내용1_2),
  MAX(SEQNO2), MAX(내용2_1), MAX(내용2_2),
  MAX(SEQNO3), MAX(내용3_1), MAX(내용3_2)
FROM (
  SELECT
    직원정보,
    DECODE(RN, 1, SEQNO) AS SEQNO1, 
    DECODE(RN, 1, 내용1) AS 내용1_1,
    DECODE(RN, 1, 내용2) AS 내용1_2,
    DECODE(RN, 2, SEQNO) AS SEQNO2, 
    DECODE(RN, 2, 내용1) AS 내용2_1,
    DECODE(RN, 2, 내용2) AS 내용2_2,
    DECODE(RN, 3, SEQNO) AS SEQNO3, 
    DECODE(RN, 3, 내용1) AS 내용3_1,
    DECODE(RN, 3, 내용2) AS 내용3_2
  FROM
    (SELECT 직원정보, SEQNO, 내용1, 내용2
          , ROW_NUMBER() OVER (PARTITION BY 직원정보 ORDER BY SEQNO) RN 
       FROM T)
)
GROUP BY
  직원정보 

 


by 마농 [2015.09.11 10:31:22]
SELECT 직원정보
     , SUBSTR(seqno, 1, 8) ymd
     , MIN(DECODE(SUBSTR(seqno, 9), '000001', 내용1)) 내용1_1
     , MIN(DECODE(SUBSTR(seqno, 9), '000001', 내용2)) 내용2_1
     , MIN(DECODE(SUBSTR(seqno, 9), '000002', 내용1)) 내용1_2
     , MIN(DECODE(SUBSTR(seqno, 9), '000002', 내용2)) 내용2_2
     , MIN(DECODE(SUBSTR(seqno, 9), '000003', 내용1)) 내용1_3
     , MIN(DECODE(SUBSTR(seqno, 9), '000003', 내용2)) 내용2_3
  FROM t
 GROUP BY 직원정보, SUBSTR(seqno, 1, 8)
;

 


by 허접탱이 [2015.09.11 13:36:40]

아발란체님, jkson님, 마농님.. 질문에 도움 주셔서 정말로 감사합니다.^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입