| 고객 | 카드종류 | 카드이력코드 | 기록일시 | 해제일시 | 비고 |
| A | 카드A | 01 | 20160730 | 20160827 | 카드제작 |
| A | 카드A | 02 | 20160822 | 20160825 | 카드전달 |
| A | 카드A | 00 | 20200530 | 장기휴면으로 인한 해지 | |
| A | 카드B | 01 | 20230416 | 20230424 | 카드제작 |
| A | 카드B | 02 | 20230424 | 카드전달 | |
| A | 카드B | 03 | 20230804 | 카드교체 | |
| B | 카드A | 01 | 20230805 | 카드제작 | |
| B | 카드A | 01 | 20230901 | 카드전달 | |
| C | 카드A | 00 | 20210801 | 장기휴면으로 인한 해지 |
조회대상 : 카드이력코드 ='00' 이면서 기록일시가 현재 SYSDATE기준으로 1년이 경과하였고 1년안에 해제일시가 없으며, ---(1)
해지되지 않은 다른 카드를 보유하고 있지 않는 고객과 카드종류를 조회하시오.
(1) 해지된 카드 조건입니다.
위의 예시데이터에서 A고객은 해지카드를 보유하고 있으나 다른 유효카드가 있으므로 조회되면 안됩니다.
해지된 카드를 보유하고 있고 1년이 넘은 고객은 C이며 보유카드는 카드 A ---> 정답으로서 C고객과 카드A만 조회되도록 하는 SQL을 구하고 싶습니다.
위의 내용을 구하는 오라클 SQL을 알려주시면 감사하겠습니다.
WITH t AS
(
SELECT 'A' id, '카드A' cd, '01' st, '20160730' sdt, '20160827' edt, '카드제작' cmt FROM dual
UNION ALL SELECT 'A', '카드A', '02', '20160822', '20160825', '카드전달' FROM dual
UNION ALL SELECT 'A', '카드A', '00', '20200530', '' , '장기휴면으로 인한 해지' FROM dual
UNION ALL SELECT 'A', '카드B', '01', '20230416', '20230424', '카드제작' FROM dual
UNION ALL SELECT 'A', '카드B', '02', '20230424', '' , '카드전달' FROM dual
UNION ALL SELECT 'A', '카드B', '03', '20230804', '' , '카드교체' FROM dual
UNION ALL SELECT 'B', '카드A', '01', '20230805', '' , '카드제작' FROM dual
UNION ALL SELECT 'B', '카드A', '01', '20230901', '' , '카드전달' FROM dual
UNION ALL SELECT 'C', '카드A', '00', '20210801', '' , '장기휴면으로 인한 해지' FROM dual
)
SELECT *
FROM (SELECT id
, cd
, MAX(st) KEEP(DENSE_RANK LAST ORDER BY sdt) st
, MAX(sdt) sdt
, MAX(
CASE WHEN MAX(st) KEEP(DENSE_RANK LAST ORDER BY sdt) = '00'
AND MAX(sdt) < TO_CHAR(ADD_MONTHS(sysdate, -12), 'yyyymmdd')
THEN 1 ELSE 2 END
) OVER(PARTITION BY id) flag
FROM t
GROUP BY id, cd
)
WHERE flag = 1
;
안녕하세요. 이렇게 빨리 답변주시니
정말 감사드립니다.
내용 확인해보겠습니다.
좋은 하루되세요