WITH TAB AS (
SELECT 'A' GRP , 'AAA' KEY , '20160301' ST_DT , '20160331' ED_DT FROM DUAL
UNION ALL
SELECT 'A' GRP , 'BBB' KEY , '20160301' ST_DT , '20160331' ED_DT FROM DUAL
UNION ALL
SELECT 'B' GRP , 'AAA' KEY , '20160501' ST_DT , '20160531' ED_DT FROM DUAL
UNION ALL
SELECT 'B' GRP , 'BBB' KEY , '20160501' ST_DT , '20160531' ED_DT FROM DUAL
)
SELECT * FROM TAB A
WHERE '201603' BETWEEN SUBSTR(A.ST_DT, 0, 6) AND SUBSTR(A.ED_DT, 0, 6)
위처럼 조회하면
3월에 데이터만 조회되겠죠
--결과
GRP KEY ST_DT ED_DT
A AAA 20160301 20160331
A BBB 20160301 20160331
제가 원하는 결과는
GRP KEY ST_DT ED_DT
A AAA 20160301 20160331
B AAA
A BBB 20160301 20160331
B BBB
만약 5월을 조회할 경우
GRP KEY ST_DT ED_DT
A AAA
B AAA 20160501 20160531
A BBB
B BBB 20160501 20160531
위처럼 기간에 걸리지 않더라고 그룹A 다음에는 그룹B를 보여주고 싶거든요
보통 이런경우 보통 유니온 시켰던거 같은데
위 경우는 AAA 와 BBB가 여러건이 나오다 보니..
적용을 어떻게 해야될지 모르겠네요..
도와주세요.. ㅠㅠ
WITH TAB AS ( SELECT 'A' GRP , 'AAA' KEY , '20160301' ST_DT , '20160331' ED_DT FROM DUAL UNION ALL SELECT 'A' GRP , 'BBB' KEY , '20160301' ST_DT , '20160331' ED_DT FROM DUAL UNION ALL SELECT 'B' GRP , 'AAA' KEY , '20160501' ST_DT , '20160531' ED_DT FROM DUAL UNION ALL SELECT 'B' GRP , 'BBB' KEY , '20160501' ST_DT , '20160531' ED_DT FROM DUAL ) SELECT grp, key , case when '201603' between SUBSTR(A.ST_DT, 0, 6) AND SUBSTR(A.ED_DT, 0, 6) then st_dt end st_dt , case when '201603' between SUBSTR(A.ST_DT, 0, 6) AND SUBSTR(A.ED_DT, 0, 6) then ED_DT end ED_DT FROM TAB A order by key, grp;
PARTITION OUTER JOIN 은 ANSI 구문에서만 쓸 수 있는 구문입니다.
오라클 (+) 로 바꾸면 PATITION BY 쓸 수 없어서
쿼리가 더 복잡해지고, 성능도 느려집니다.
(+) 로 바꾸려는 특별한 이유라도 있나요?
SELECT a.grp , a.key , b.st_dt , b.ed_dt FROM (SELECT x.grp, y.key FROM (SELECT 'A' grp FROM dual UNION ALL SELECT 'B' FROM dual ) x , (SELECT DISTINCT key FROM tab WHERE st_dt <= '201603'||'31' AND ed_dt >= '201603'||'01' ) y ) a , (SELECT * FROM tab WHERE st_dt <= '201603'||'31' AND ed_dt >= '201603'||'01' ) b WHERE a.grp = b.grp(+) AND a.key = b.key(+) ORDER BY key, grp ;