테이블에 데이터가 ID / 18/04/01 / 18/04/08 / 18/04/15 이렇게 되어있나요?
NAEM / ID 칼럼은 고정이구요...나머지 칼럼은 DYNAMIC 합니다.
물론 결과 값도 고정은 아니구요..DYNAMIC하게 늘어 납니다.
DYNAMIC 처리전에 주셔야합니다.
안그러면 불필요한 쿼리가 추가됩니다.
원본이 원본이 아닌 중간집합일 것 같다는 생각이 드네요.
중간집합이 아닌 원본을가지고 원본 대비 결과표로 질문해 주시던가?
아니면 중간집합을 만들어내는 쿼리를 보여주세요.
마농님.
중간집합 쿼리를 드리고 싶은데요..
너무 길어요...ㅠㅠ
그냥 원본 대비 결과표 간략하게 샘플을 주세요.
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'
;
모델절이라는 게 있어서 만들어봤습니다.
어렵네요.
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 ;
전 MODEL절 잘 몰라요. ㅎㅎ
"CAST(name AS VARCHAR2(10)) name " 를 한 이유와 원인을 마농님 덕분에 알았네요. ^^
저도 day1['BW vs BP'] 를 시도했는데, "열에 입력한 값이 너무 큽니다." 라는 오류나더군요.
한 수 배우고 갑니다.
마농님 위에 이미지가 최대한 원본에 가깝고, 결과도 이미지 처럼 출력 되길 원하는 사항입니다.
귀찮게 해드려 죄송스럽네요
제 생각엔 아래로 나열된 날짜를 옆으로 바꾼 것 같은데요? 아닌가요?
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
;
마농님
많은 도움이 되었습니다..감사합니다.