SQL질문. 피벗 및 고정 열 고정 행 0 8 1,248

by 스파르타 [2019.08.15 21:33:30]


수정하다그만..  추후 다시올릴게요 질문내용

# 단순한 피벗은 가능한데. 피벗과 고정행 고정열 맞추어 없으면 자리까지 만들어줘야하는게 잘안풀리네요.

데이터는 년월일에 seq로 쭈욱있는형태구요 100건이있어도 6개만 dt6까지 

1. 우선 GBN 은 CODE 에 맨뒤 L과 R 을 구분한 것이고.
2. 
3. M GBN 값은 MX, MY, MZ 에 뒷자리 3개 를 열로 가져온것입니다. (이 x y z 값이 없어도 0 으로 나오도록 )
4. DT1 ~ DT6 까지 잇는데 DT6 값은 있는데 구멍을 일부러 만들었구요. (고정 컬럼입니다.) 없어도 나오도록.
   일자에 SEQ 순으로 값을 행으로 열로 나오도록요.   없는 값은  0으로 표기.
  
  
집합이 안되네요.. 꽉막혀서 도움청합니다. 이게 가능한지.;;
에궁.. 날씨가 덥습니다 고생하세요 ^^;

by 마농 [2019.08.16 09:22:01]

원하는 결과가 어딘가 이상합니다.
l_val 부분이 모순되는 부분입니다.
이 부분이 없어야 말이 됩니다.
이 부분도 같이 표현되려면? x,y,z 처럼 6개 항목(dt1~dt6)으로 나누어 져야 합니다.
구분값을 x,y,z,l1,l2,l3 6개로 가져가는 방법도 있구요.


by 스파르타 [2019.08.16 09:49:01]

l_val  값이  일자에 시퀀스가 최신꺼 로 열로 보여달라고 해서... 

l_val 빼고 부탁드립니다.  수정할게요

 


by 마농 [2019.08.16 10:01:20]
WITH t1(code, code1, code2, m_dt, m_seq, mx, my, mz, l1, l2, l3) AS
(
SELECT           '001L', '01', '02', '20190813', 5, 1.0, 1.1, 2.1, 1, 11, 111 FROM dual
UNION ALL SELECT '001R', '01', '02', '20190813', 5, 1.5, 1.2, 2.2, 2, 22, 222 FROM dual
UNION ALL SELECT '001L', '01', '02', '20190813', 4, 1.2, 1.3, 2.3, 3, 33, 333 FROM dual
UNION ALL SELECT '001L', '01', '02', '20190813', 3, 1.0, 1.4, 2.4, 4, 44, 444 FROM dual
UNION ALL SELECT '001R', '01', '02', '20190813', 3, 1.3, 1.5, 2.5, 5, 55, 555 FROM dual
UNION ALL SELECT '001L', '01', '02', '20190726', 2, 1.4, 1.6, 2.6, 6, 66, 666 FROM dual
UNION ALL SELECT '001R', '01', '02', '20190726', 2, 1.5, 1.7, 2.7, 7, 77, 777 FROM dual
UNION ALL SELECT '001L', '01', '02', '20190726', 1, 1.6, 1.8, 2.8, 8, 88, 888 FROM dual
UNION ALL SELECT '001R', '01', '02', '20190726', 1, 1.7, 1.9, 2.9, 9, 99, 999 FROM dual
)
SELECT *
  FROM (SELECT SUBSTR(code, 4, 1) gbn
             , DENSE_RANK() OVER(ORDER BY m_dt DESC, m_seq DESC) dr
             , mx x
             , my y
             , mz z
          FROM t1
         WHERE code1 = '01'
           AND code2 = '02'
           AND code IN ('001L', '001R')
        )
 UNPIVOT (v FOR m_gbn IN (x, y, z))
 PIVOT (MIN(v) FOR dr IN (1 dt1, 2 dt2, 3 dt3, 4 dt4, 5 dt5, 6 dt6))
 ORDER BY gbn, m_gbn
;

 


by 스파르타 [2019.08.16 10:26:03]

아 정말 신기합니다...

저는 왜 안될까요 ㅠㅠ 엄청 쿼리만 길어지다가

맨붕오는데 ㅠㅠ 저렇게 간략하게 짜실수가...

언피벗 피벗 두번사용해서 하는게... 저는 머리로 이해를 못했어요...   어렵네여 

감사합니다. ^^


by 마농 [2019.08.16 11:22:46]

기존 질문에 있던 l_val 포함.

WITH t1(code, code1, code2, m_dt, m_seq, mx, my, mz, l1, l2, l3) AS
(
SELECT           '001L', '01', '02', '20190813', 5, 1.0, 1.1, 2.1, 1, 11, 111 FROM dual
UNION ALL SELECT '001R', '01', '02', '20190813', 5, 1.5, 1.2, 2.2, 2, 22, 222 FROM dual
UNION ALL SELECT '001L', '01', '02', '20190813', 4, 1.2, 1.3, 2.3, 3, 33, 333 FROM dual
UNION ALL SELECT '001L', '01', '02', '20190813', 3, 1.0, 1.4, 2.4, 4, 44, 444 FROM dual
UNION ALL SELECT '001R', '01', '02', '20190813', 3, 1.3, 1.5, 2.5, 5, 55, 555 FROM dual
UNION ALL SELECT '001L', '01', '02', '20190726', 2, 1.4, 1.6, 2.6, 6, 66, 666 FROM dual
UNION ALL SELECT '001R', '01', '02', '20190726', 2, 1.5, 1.7, 2.7, 7, 77, 777 FROM dual
UNION ALL SELECT '001L', '01', '02', '20190726', 1, 1.6, 1.8, 2.8, 8, 88, 888 FROM dual
UNION ALL SELECT '001R', '01', '02', '20190726', 1, 1.7, 1.9, 2.9, 9, 99, 999 FROM dual
)
SELECT gbn
     , NVL("1_L", 0) l_val
     , m_gbn
     , NVL("1_M", 0) dt1
     , NVL("2_M", 0) dt2
     , NVL("3_M", 0) dt3
     , NVL("4_M", 0) dt4
     , NVL("5_M", 0) dt5
     , NVL("6_M", 0) dt6
  FROM (SELECT SUBSTR(code, 4, 1) gbn
             , DENSE_RANK() OVER(ORDER BY m_dt DESC, m_seq DESC) dr
             , mx, my, mz
             , l1, l2, l3
          FROM t1
         WHERE code1 = '01'
           AND code2 = '02'
           AND code IN ('001L', '001R')
        )
 UNPIVOT ((m, l) FOR m_gbn IN ((mx, l1) AS 'X', (my, l2) AS 'Y', (mz, l3) AS 'Z'))
 PIVOT (MIN(m) m, MIN(l) l FOR dr IN (1, 2, 3, 4, 5, 6))
 ORDER BY gbn, m_gbn
;

 


by 스파르타 [2019.08.16 13:51:19]

1_L   이라는 것과 1_M 이들의

명칭은 어디서 나오는건가요? 어디에서 참조가되는건지 ^^


by 마농 [2019.08.16 14:20:54]

MIN(m) m 에서의 "M" 과
dr IN (1, 2, 3, 4, 5, 6) 에서 "1", "2", "3", ... 이 결합하여
"1_M", "2_M" 이 나옵니다.


by 스파르타 [2019.08.16 14:23:07]

아 컬럼이 실제 그렇게 나오네요..

저는 원본꺼에서 조금만 고쳤더니 에러가나서..

그 컬럼이 오디서 나온지 모르고 ^^

 

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