데이터 옆으로 출력 0 5 849

by 공미나 [SQL Query] [2018.05.16 19:47:43]


11111.PNG (25,724Bytes)
22222222.PNG (27,393Bytes)

안녕하세요.

오라클 초보입니다.

쿼리를 짜다가 막혀서 질문올립니다 ㅠㅠ

 

첫번째 사진같은 테이블이 있어요.

두번째 사진 엑셀 양식처럼 추출하고 싶습니다.

ID마다 SEQNO 순서대로 옆으로 출력하고 싶은데 어떻게 해야할지 도무지 생각이 나지가 않네요..

ID에 SEQNO가 100번이 넘는것도 있는데 ID마다 SEQNO가 들어있는 값만큼

옆으로 출력하고 싶습니다..

xmlagg 함수로 일자1,일자2,금액1,금액2를 넣어서 출력해보려고 했는데

오류가 나더라구요..ㅠㅠ

 

좋은 방법 있으시면 도와주세요ㅠㅠ 

감사합니다

 

 

by 우리집아찌 [2018.05.16 19:54:02]

1.DBMS는 무얼쓰시는지

2.샘플데이터의 내역1 ,2,3 부분은 안보인니다.

3.출력결과의 내역1,2,3 컬럼은 컬럼인지 부정확합니다.

다시 샘플데이터와 원하시는 결과물을 정리해서 올려주세요. 

 

 


by 공미나 [2018.05.16 19:58:31]

1. 골든입니다.

2,3 데이터 다시 수정해서 올리겠습니다


by 우리집아찌 [2018.05.16 20:21:01]

DBMS 는 오라클 , MY-SQL , MS-SQL 등을 말하는겁니다.

 

1. 위처럼 컬럼명을 2단으로 표기는 어렵습니다.

내역이 컬럼이면 안에들어가는 일자와 금액의 포맷이 존재해야합니다.

2. 왼쪽으로 한없이 늘어나려면 DYNAMIC SQL을 써야합니다.

그냥 STATIC 방식으로는 힘들겠네요.

그래서 보통은 내역이 MAX가 정해져있어서 하드코딩처럼 쓰던가

아니면 구분자를 넣어서 하나의 컬럼으로 출력해서 프로그램단에서 SLIT 해서 씁니다.

 


by 마농 [2018.05.17 08:25:59]

최대 개수만큼 하드코딩 하시면 됩니다만...
현재 세로로 나오는 상태가 훨씬 더 보기 좋은데
왜 굳이 보기 힘들게 가로로 바꾸려는지 모르겠네요?

WITH t AS
(
SELECT 111111 id,  1 seqno, '2000-01-01' dat1, '2000-02-01' dat2, 1000 amt1, 1100 amt2 FROM dual
UNION ALL SELECT 111111,  2, '2000-01-02', '2000-02-02',   2000,   1200 FROM dual
UNION ALL SELECT 111111,  3, '2000-01-03', '2000-02-03',   3000,   1300 FROM dual
UNION ALL SELECT 111111,  4, '2000-01-04', '2000-02-04',   4000,   1400 FROM dual
UNION ALL SELECT 111111,  5, '2000-01-05', '2000-02-05',   5000,   1500 FROM dual
UNION ALL SELECT 111111,  6, '2000-01-06', '2000-02-06',   6000,   1600 FROM dual
UNION ALL SELECT 111111,  7, '2000-01-07', '2000-02-07',   7000,   1700 FROM dual
UNION ALL SELECT 111111,  8, '2000-01-08', '2000-02-08',   8000,   1800 FROM dual
UNION ALL SELECT 111111,  9, '2000-01-09', '2000-02-09',   9000,   1900 FROM dual
UNION ALL SELECT 111111, 10, '2000-01-10', '2000-02-10',  10000,   2000 FROM dual
UNION ALL SELECT 222222,  1, '2000-01-11', '2000-02-11', 100000, 110000 FROM dual
UNION ALL SELECT 222222,  2, '2000-01-12', '2000-02-12', 200000, 120000 FROM dual
UNION ALL SELECT 222222,  3, '2000-01-13', '2000-02-13', 300000, 130000 FROM dual
UNION ALL SELECT 222222,  4, '2000-01-14', '2000-02-14', 400000, 140000 FROM dual
UNION ALL SELECT 333333,  3, '2000-01-15', '2000-02-15',    100,    200 FROM dual
UNION ALL SELECT 333333,  4, '2000-01-16', '2000-02-16',    200,    300 FROM dual
)
SELECT *
  FROM (SELECT id, dat1, dat2, amt1, amt2
             , ROW_NUMBER() OVER(PARTITION BY id ORDER BY seqno) rn
          FROM t
        )
 PIVOT (MIN(dat1) dat1, MIN(dat2) dat2, MIN(amt1) amt1, MIN(amt2) amt2
        FOR rn IN (  1,  2,  3,  4,  5,  6,  7,  8,  9, 10
                  , 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
                  -- 최대 개수만큼 추가 --
                  )
        )
;
SELECT id
     , LISTAGG(dat1 ||', '|| dat2 ||', '|| LPAD(amt1, 6, ' ') ||', '|| LPAD(amt2, 6, ' ')
       , ' | ') WITHIN GROUP(ORDER BY seqno) contents
  FROM t
 GROUP BY id
;

 


by 공미나 [2018.05.17 21:07:02]

정말 감사합니다!!

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