옆으로 줄 세우기 0 9 3,502

by 바람이불면 [SQL Query] LAG 논리구조 [2012.10.25 15:25:58]


안녕하세요 늘 도움을 잘 받아가고 있는 바람이 불면입니다~

오늘 질문은...

ID        Status      Amount      기간
============================
1           H            100        2012-06-05
1           C            150        2012-10-20

이런 구조의 자료가 있을 때 

ID        Status(C)      Amount(C)     기간(C)        Status(H)        Amount(H)      기간
===================================================================
1             C                  150          2012-10-20        H                 100                2012-06-05

라고 만들고 싶습니다. 

DBMS는 9i를 사용중입니다.

꼬옥 도와주세요 =)

---------------------------------------------------------------------

또 또 추가 사항이 발생했습니다. ㅠㅠ

ID        Status      Amount      기간
============================
1           H            100        2012-06-05
1           C            150        2012-10-20
1           H            120        2012-05-01

ID        Status(C)      Amount(C)     기간(C)        Status(H)        Amount(H)      기간
===================================================================
1             C                  150          2012-10-20        H                 100                2012-06-05
1             H                  100          2012-06-05        H                 120                2012-05-01


이렇게 되어 있으면 어떻게 해야할까요 ㅠㅠ
자꾸 사양이 바뀌네요... 
connect by 를 써서 작업을 해야 할까요 ㅠㅠ
by 마농 [2012.10.25 15:51:02]
SELECT id
     , MIN(DECODE(status, 'C', status)) status_c
     , MIN(DECODE(status, 'C', amount)) amount_c
     , MIN(DECODE(status, 'C', 기간)) 기간_c
     , MIN(DECODE(status, 'H', status)) status_h
     , MIN(DECODE(status, 'H', amount)) amount_h
     , MIN(DECODE(status, 'H', 기간)) 기간_h
  FROM t
 GROUP BY id
 ORDER BY id
;

by 아발란체 [2012.10.25 16:12:17]
 
-- 방법 추가 / 이 경우 데이타 중복이 2건 미만 아니면 데이타 엉터리로 출력됨.
WITH T(V1, V2, V3, V4) AS (
  SELECT 1, 'H', 100, '2012-06-05' FROM DUAL UNION ALL
  SELECT 1, 'C', 150, '2012-10-20' FROM DUAL UNION ALL
  SELECT 2, 'H', 100, '2012-06-05' FROM DUAL UNION ALL
  SELECT 2, 'H', 100, '2012-06-05' FROM DUAL UNION ALL
  SELECT 4, 'H3', 100, '2012-06-05' FROM DUAL UNION ALL
  SELECT 4, 'H33', 100, '2012-06-05' FROM DUAL UNION ALL
  SELECT 3, 'H', 200, '2012-06-05' FROM DUAL
)
SELECT
  T1.V1, T1.V2, T1.V3, T2.V2, T2.V3
FROM 
  (SELECT ROWNUM RN, T.* FROM T) T1,
  (SELECT ROWNUM RN, T.* FROM T) T2
WHERE
  T1.V1 = T2.V1(+)
  AND T1.RN != T2.RN(+)
  AND MOD(T1.RN, 2) = 1

by 바람이불면 [2012.10.25 17:05:22]
추가 사항이 발생하였습니다. ㅠㅠ
아오... 진짜... 사람 힘들게 하네요 ;;;

by 마농 [2012.10.25 17:16:37]

예시가 c 1건, h 2건인데...
만약 c 2건, h 2건이면 어떻게 나와야 할까요?
만약 c 2건, h 3건이면 어떻게 나와야 할까요?


by 바람이불면 [2012.10.25 17:47:46]
마농님 //
C는 무조건 1건이고 H는 여러건이 나올 수 있습니다. 
C= Current 이고 
H= History 이거든요. 

by 마농 [2012.10.25 17:56:19]
SELECT *
  FROM (SELECT id
             , 'C' status_c
             , MIN(DECODE(status, 'C', amount)) OVER(PARTITION BY id) amount_c
             , MIN(DECODE(status, 'C', 기간)) OVER(PARTITION BY id) 기간_c
             , status status_h
             , amount amount_h
             , 기간 기간_h
          FROM t
        )
 WHERE status_h = 'H'
;

by 마농 [2012.10.25 17:58:37]

앗...그새 결과가 바뀌었네요. 분명 좌측에 2건다 C 였는데...헉...


by 바람이불면 [2012.10.25 18:00:25]
아.. 또 사양이 바뀌었습니다. ㅠㅠ

처음에는 Current와 비교라고 했는데..
History 별로 비교를 해야 한다고 하네요...

다르게 설명하면..

ID        H_id        amount    Status
-------------------------------------------------------
1          0               150         C
1          1               120         H
1          2               100         H

이럴때 저런 결과를 가지고 와야 한다고 합니다... 
한숨 나오네요. ㅠㅠ

by 마농 [2012.10.25 18:04:41]
SELECT *
  FROM (SELECT id
             , status
             , amount
             , 기간
             , LAG(status) OVER(PARTITION BY id ORDER BY 기간) status_h
             , LAG(amount) OVER(PARTITION BY id ORDER BY 기간) amount_h
             , LAG(기간) OVER(PARTITION BY id ORDER BY 기간) 기간_h
          FROM t
        )
 WHERE status_h IS NOT NULL
 ORDER BY id, 기간 DESC
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입