엑셀 로직을 쿼리로 바꿔야 해서 넘 어렵네요....도와주세요
아래 로직 보시고 쿼리로 가능하면 부탁드립니다.
예상순서 | 실제순서 | 준수구분 | 로직설명 |
1 | 1 | Y | 실제순서 1행~1행 범위내에 실제순서 1행-1의 값(1)이 있으면 Y 아니면 N |
2 | 3 | N | 실제순서 1행~2행 범위내에 실제순서 2행-1의 값(2)이 있으면 Y 아니면 N |
3 | 2 | Y | 실제순서 1행~3행 범위내에 실제순서 3행-1의 값(1)이 있으면 Y 아니면 N |
4 | 5 | N | 실제순서 1행~4행 범위내에 실제순서 4행-1의 값(4)이 있으면 Y 아니면 N |
5 | 4 | Y | 실제순서 1행~5행 범위내에 실제순서 5행-1의 값(3)이 있으면 Y 아니면 N |
WITH t AS ( SELECT 1 plan_seq, 1 real_seq FROM dual UNION ALL SELECT 2, 3 FROM dual UNION ALL SELECT 3, 2 FROM dual UNION ALL SELECT 4, 5 FROM dual UNION ALL SELECT 5, 4 FROM dual ) SELECT a.plan_seq , a.real_seq , NVL2(b.plan_seq, 'Y', 'N') yn FROM t a LEFT OUTER JOIN t b ON a.plan_seq >= b.plan_seq AND a.real_seq = b.plan_seq ORDER BY a.plan_seq ;
WITH t AS ( SELECT 1 plan_seq, 1 real_seq FROM dual UNION ALL SELECT 2, 3 FROM dual UNION ALL SELECT 3, 2 FROM dual UNION ALL SELECT 4, 5 FROM dual UNION ALL SELECT 5, 4 FROM dual ) SELECT plan_seq , real_seq , DECODE( INSTR(SYS_CONNECT_BY_PATH(real_seq, '-')||'-', '-'||plan_seq||'-') , 0, 'N', 'Y') yn FROM t START WITH plan_seq = 1 CONNECT BY PRIOR plan_seq + 1 = plan_seq ;
마농님 감사합니다. 데이터를 확인하니 real_seq가 plan_seq와 같은 범위에 있지 않은 경우가 있어서 쿼리를 임의로 수정하여 사용했습니다. WITH T AS (SELECT 1 PLAN_SEQ, 3 REAL_SEQ FROM DUAL UNION ALL SELECT 2 PLAN_SEQ, 4 REAL_SEQ FROM DUAL UNION ALL SELECT 3 PLAN_SEQ, 7 REAL_SEQ FROM DUAL UNION ALL SELECT 4 PLAN_SEQ, 5 REAL_SEQ FROM DUAL UNION ALL SELECT 5 PLAN_SEQ, 6 REAL_SEQ FROM DUAL) SELECT a.plan_seq, a.real_seq, DECODE(a.plan_seq, 1, 'Y', NVL2(b.plan_seq, 'Y', 'N')) yn from t a left outer join t b on a.plan_seq >= b.plan_seq and a.real_seq - 1 = b.real_seq order by plan_seq ;
첫번째 YN은 무조건 N으로 나와서 Y로 변경하는 로직을 넣었습니다.
감사합니다
자세히 설명드리자면 일별 생산계획 준수확인용입니다
WITH T AS (SELECT '20230601' PLAN_DATE, 0 PLAN_SEQ, '20230531' REAL_DATE, 1 REAL_SEQ FROM DUAL UNION ALL SELECT '20230601' PLAN_DATE, 0 PLAN_SEQ, '20230531' REAL_DATE, 2 REAL_SEQ FROM DUAL UNION ALL SELECT '20230601' PLAN_DATE, 1 PLAN_SEQ, '20230601' REAL_DATE, 3 REAL_SEQ FROM DUAL UNION ALL SELECT '20230601' PLAN_DATE, 2 PLAN_SEQ, '20230601' REAL_DATE, 5 REAL_SEQ FROM DUAL UNION ALL SELECT '20230601' PLAN_DATE, 3 PLAN_SEQ, '20230601' REAL_DATE, 4 REAL_SEQ FROM DUAL UNION ALL SELECT '20230601' PLAN_DATE, 4 PLAN_SEQ, '20230601' REAL_DATE, 6 REAL_SEQ FROM DUAL UNION ALL SELECT '20230601' PLAN_DATE, 5 PLAN_SEQ, '20230601' REAL_DATE, 7 REAL_SEQ FROM DUAL )
데이터는 금일 생산계획대비 실제생산 데이터인데 REAL_DATE가 오늘이 아닌 경우는 준수구분이 자동 N이고 PLAN_SEQ가 0입니다.
이후 설명은 위와 동일합니다.