고수님들의 도움 요청드립니다. 0 14 765

by InsideCore [SQL Query] [2018.04.12 17:03:49]


그림1.gif (58,483Bytes)

안녕하세요.

도저히 답을 찾지 못하고, 도움을 청하게 되었습니다.

 

아래 이미지와 같은 결과를 얻고자 하는데요.

도움 부탁 드리겠습니다.

 

 

로직은 각각의 라인별에 대한 부분입니다.

 

by 우리집아찌 [2018.04.12 17:27:01]

테이블에 데이터가 ID /  18/04/01 / 18/04/08 / 18/04/15 이렇게 되어있나요?


by InsideCore [2018.04.13 08:49:16]

NAEM / ID 칼럼은 고정이구요...나머지 칼럼은 DYNAMIC 합니다.

물론 결과 값도 고정은 아니구요..DYNAMIC하게 늘어 납니다.


by 우리집아찌 [2018.04.13 09:45:11]

DYNAMIC 처리전에 주셔야합니다.

안그러면 불필요한 쿼리가 추가됩니다.


by 마농 [2018.04.12 17:48:45]

원본이 원본이 아닌 중간집합일 것 같다는 생각이 드네요.
중간집합이 아닌 원본을가지고 원본 대비 결과표로 질문해 주시던가?
아니면 중간집합을 만들어내는 쿼리를 보여주세요.


by InsideCore [2018.04.13 08:50:26]

마농님.

중간집합 쿼리를 드리고 싶은데요..

너무 길어요...ㅠㅠ


by 마농 [2018.04.13 08:54:43]

그냥 원본 대비 결과표 간략하게 샘플을 주세요.


by 신이만든지기 [2018.04.12 18:23:00]
WITH DATA(NAME, ID, DAY1, DAY2, DAY3) AS (
    SELECT 'BW', 18011711, 0,     13017, 15370 FROM DUAL UNION ALL
    SELECT 'BW', 18011712, 0,        95,     0 FROM DUAL UNION ALL
    SELECT 'BW', 18013111, 0,      3966,     0 FROM DUAL UNION ALL
    SELECT 'BP', 18011711, 15588,  8323,     0 FROM DUAL UNION ALL
    SELECT 'BP', 18011712, 2,         0,     0 FROM DUAL UNION ALL
    SELECT 'BP', 18013111, 0,      7277, 15412 FROM DUAL
)
SELECT 'BW VS BP' NAME, ID, DAY1, DAY2, DAY3
  FROM (
        SELECT NAME, ID, DAY1, DAY2, DAY3
          FROM DATA
         MODEL
         DIMENSION BY (NAME, ID)
         MEASURES ( DAY1, DAY2, DAY3)
         RULES 
               (
                 DAY1['BW', 18011711] = DAY1['BP', 18011711] - DAY1['BW', 18011711]
               , DAY1['BW', 18011712] = DAY1['BP', 18011712] - DAY1['BW', 18011712]
               , DAY1['BW', 18013111] = DAY1['BP', 18013111] - DAY1['BW', 18013111]
               , DAY2['BW', 18011711] = DAY2['BP', 18011711] - DAY2['BW', 18011711] + DAY1['BW', 18011711]
               , DAY2['BW', 18011712] = DAY2['BP', 18011712] - DAY2['BW', 18011712] + DAY1['BW', 18011712]
               , DAY2['BW', 18013111] = DAY2['BP', 18013111] - DAY2['BW', 18013111] + DAY1['BW', 18013111]
               , DAY3['BW', 18011711] = DAY3['BP', 18011711] - DAY3['BW', 18011711] + DAY2['BW', 18011711]
               , DAY3['BW', 18011712] = DAY3['BP', 18011712] - DAY3['BW', 18011712] + DAY2['BW', 18011712]
               , DAY3['BW', 18013111] = DAY3['BP', 18013111] - DAY3['BW', 18013111] + DAY2['BW', 18013111]
               )       
        )
  WHERE NAME = 'BW'
;

모델절이라는 게 있어서 만들어봤습니다.

어렵네요.


by 마농 [2018.04.13 10:16:25]
WITH data AS
(
SELECT 'BW' name, 18011711 id, 0 day1, 13017 day2, 15370 day3 FROM dual 
UNION ALL SELECT 'BW', 18011712,     0,    95,     0 FROM dual
UNION ALL SELECT 'BW', 18013111,     0,  3966,     0 FROM dual
UNION ALL SELECT 'BP', 18011711, 15588,  8323,     0 FROM dual
UNION ALL SELECT 'BP', 18011712,     2,     0,     0 FROM dual
UNION ALL SELECT 'BP', 18013111,     0,  7277, 15412 FROM dual
)
SELECT *
  FROM data
 MODEL
-- RETURN UPDATED ROWS -- 결과만 보고자 할때 주석 해제
 PARTITION BY (id)
 DIMENSION BY (CAST(name AS VARCHAR2(10)) name)
 MEASURES (day1, day2, day3)
 RULES
 ( day1['BW vs BP'] = day1['BP'] - day1['BW']
 , day2['BW vs BP'] = day2['BP'] - day2['BW'] + day1[CV()]
 , day3['BW vs BP'] = day3['BP'] - day3['BW'] + day2[CV()]
 )
 ORDER BY DECODE(name, 'BW', 1, 'BP', 2, 3), id
;

 


by 신이만든지기 [2018.04.13 10:25:51]

"CAST(name AS VARCHAR2(10)) name " 를 한 이유와 원인을 마농님 덕분에 알았네요. ^^

저도 day1['BW vs BP'] 를 시도했는데, "열에 입력한 값이 너무 큽니다." 라는 오류나더군요.

한 수 배우고 갑니다.


by 우리집아찌 [2018.04.13 10:55:29]

전 MODEL절 잘 몰라요. ㅎㅎ


by InsideCore [2018.04.13 09:25:50]

마농님 위에 이미지가 최대한 원본에 가깝고, 결과도 이미지 처럼 출력 되길 원하는 사항입니다.

귀찮게 해드려 죄송스럽네요


by 마농 [2018.04.13 09:46:43]

제 생각엔 아래로 나열된 날짜를 옆으로 바꾼 것 같은데요? 아닌가요?


by 마농 [2018.04.13 10:30:26]
WITH data AS
(
SELECT 'BW' name, 18011711 id, 0 day1, 13017 day2, 15370 day3 FROM dual 
UNION ALL SELECT 'BW', 18011712,     0,    95,     0 FROM dual
UNION ALL SELECT 'BW', 18013111,     0,  3966,     0 FROM dual
UNION ALL SELECT 'BP', 18011711, 15588,  8323,     0 FROM dual
UNION ALL SELECT 'BP', 18011712,     2,     0,     0 FROM dual
UNION ALL SELECT 'BP', 18013111,     0,  7277, 15412 FROM dual
)
SELECT *
  FROM (SELECT id, gb, bw, bp
             , SUM(bp - bw) OVER(PARTITION BY id ORDER BY gb) x
          FROM data
         UNPIVOT (day FOR gb IN (day1, day2, day3))
         PIVOT (MIN(day) FOR name IN ('BW' bw, 'BP' bp))
        )
 UNPIVOT (day FOR name IN (bw, bp, x AS 'BW vs BP'))
 PIVOT (MIN(day) FOR gb IN ('DAY1' day1, 'DAY2' day2, 'DAY3' day3))
-- WHERE name = 'BW vs BP'
 ORDER BY DECODE(name, 'BW', 1, 'BP', 2, 3), id
;

 


by InsideCore [2018.04.16 13:57:22]

마농님

많은 도움이 되었습니다..감사합니다.

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