반갑습니다. 사내 ERP를 개발하는 도중 궁금한게 있어서 질문드립니다.
시간대별 생산 시작과 마감을 저장하는 A테이블과
30분당 실적이 업데이트 되게끔 해서
30분 단위로 몇개가 생산됬는지 저장되는 B테이블이 있습니다.
두개의 테이블을 조인하여서
실적업데이트 시간을 lag 함수를 사용하여서
실적업데이트(전) / 실적업데이트시간(후)를 구한뒤에
시간차이를 분으로 표시하는건 성공했는데
1/2라인 전체가 밑으로 lag함수로 내려가서 계산이 되다 보니까
시간차가 재대로 출력이 안되네요....
조인해서 라인별/품목을 그룹화 하여
처음 시작되는 품목의 첫행 A테이블의 생산시작이 출력되게끔 할려면
쿼리식을 어떡해 짜야할지를 모르겠네요....
간단한 팁이라도 주시면 정말 감사드리겠습니다!!
A테이블
라인 | 날짜 | 품목 | 시작시간 | 마감시간 |
1 | 20211104 | A품목 | 8:30 | 10:13 |
1 | 20211104 | B품목 | 10:16 | 11:44 |
2 | 20211104 | C품목 | 8:32 | 10:13 |
B테이블
품목 | 날짜 | 실적업데이트 시간 | 생산량 |
A품목 | 20211104 | 9:13:55 | 416 |
A품목 | 20211104 | 9:38:57 | 980 |
A품목 | 20211104 | 9:43:55 | 198 |
A품목 | 20211104 | 10:13:56 | 1168 |
B품목 | 20211104 | 10:43:57 | 1187 |
B품목 | 20211104 | 11:13:59 | 1170 |
C품목 | 20211104 | 8:43:54 | 234 |
C품목 | 20211104 | 9:01:21 | 763 |
C품목 | 20211104 | 9:13:55 | 517 |
C품목 | 20211104 | 9:38:57 | 1035 |
C품목 | 20211104 | 9:43:56 | 218 |
C품목 | 20211104 | 10:13:56 | 1270 |
결과물 (이렇게는 어떡해 짜야 할까요?)
라인 | 품목 | 날짜 | 전 | 후 | 시간차 | 생산량 |
1 | A품목 | 20211104 | 8:30 | 9:13:00 | 0:43:00 | 416 |
1 | A품목 | 20211104 | 9:13:00 | 9:38 | 0:25:00 | 980 |
1 | A품목 | 20211104 | 9:38 | 9:43:00 | 0:05:00 | 198 |
1 | A품목 | 20211104 | 9:43:00 | 9:13:00 | 0:30:00 | 1168 |
1 | B품목 | 20211104 | 10:16 | 10:43:00 | 0:27:00 | 1187 |
1 | B품목 | 20211104 | 10:43 | 11:13 | 0:30:00 | 1170 |
2 | C품목 | 20211104 | 8:32 | 8:43 | 0:11:00 | 234 |
2 | C품목 | 20211104 | 8:43 | 9:01 | 0:18:00 | 763 |
2 | C품목 | 20211104 | 9:01 | 9:13 | 0:12:00 | 517 |
2 | C품목 | 20211104 | 9:13 | 9:38 | 0:25:00 | 1035 |
2 | C품목 | 20211104 | 9:38 | 9:43 | 0:05:00 | 218 |
2 | C품목 | 20211104 | 9:43 | 10:13 | 0:30:00 | 1270 |
WITH tab_a AS ( SELECT 1 line, '20211104' dt, 'A품목' item, '08:30' stm, '10:13' etm FROM dual UNION ALL SELECT 1, '20211104', 'B품목', '10:16', '11:44' FROM dual UNION ALL SELECT 2, '20211104', 'C품목', '08:32', '10:13' FROM dual ) , tab_b AS ( SELECT 'A품목' item, '20211104' dt, '09:13:55' tm, 416 qty FROM dual UNION ALL SELECT 'A품목', '20211104', '09:38:57', 980 FROM dual UNION ALL SELECT 'A품목', '20211104', '09:43:55', 198 FROM dual UNION ALL SELECT 'A품목', '20211104', '10:13:56', 1168 FROM dual UNION ALL SELECT 'B품목', '20211104', '10:43:57', 1187 FROM dual UNION ALL SELECT 'B품목', '20211104', '11:13:59', 1170 FROM dual UNION ALL SELECT 'C품목', '20211104', '08:43:54', 234 FROM dual UNION ALL SELECT 'C품목', '20211104', '09:01:21', 763 FROM dual UNION ALL SELECT 'C품목', '20211104', '09:13:55', 517 FROM dual UNION ALL SELECT 'C품목', '20211104', '09:38:57', 1035 FROM dual UNION ALL SELECT 'C품목', '20211104', '09:43:56', 218 FROM dual UNION ALL SELECT 'C품목', '20211104', '10:13:56', 1270 FROM dual ) SELECT a.line , a.item , a.dt , LAG(SUBSTR(b.tm, 1, 5), 1, a.stm) OVER(PARTITION BY a.line, a.item ORDER BY b.tm) stm , SUBSTR(b.tm, 1, 5) etm , TO_CHAR(TO_DATE(ROUND( ( TO_DATE(SUBSTR(b.tm, 1, 5), 'hh24:mi') - TO_DATE( LAG(SUBSTR(b.tm, 1, 5), 1, a.stm) OVER(PARTITION BY a.line, a.item ORDER BY b.tm) , 'hh24:mi') ) *24*60*60 ), 'sssss'), 'hh24:mi') tm , b.qty FROM tab_a a , tab_b b WHERE a.item = b.item AND a.dt = b.dt AND SUBSTR(b.tm, 1, 5) BETWEEN a.stm AND a.etm ;
마농님 답변을 CUBRID에서 해보니 에러나서 살짝 손댄 쿼리입니다.
WITH tab_a AS ( SELECT 1 line, '20211104' dt, 'A품목' item, '08:30' stm, '10:13' etm FROM dual UNION ALL SELECT 1, '20211104', 'B품목', '10:16', '11:44' FROM dual UNION ALL SELECT 2, '20211104', 'C품목', '08:32', '10:13' FROM dual ), tab_b AS ( SELECT 'A품목' item, '20211104' dt, '09:13:55' tm, 416 qty FROM dual UNION ALL SELECT 'A품목', '20211104', '09:38:57', 980 FROM dual UNION ALL SELECT 'A품목', '20211104', '09:43:55', 198 FROM dual UNION ALL SELECT 'A품목', '20211104', '10:13:56', 1168 FROM dual UNION ALL SELECT 'B품목', '20211104', '10:43:57', 1187 FROM dual UNION ALL SELECT 'B품목', '20211104', '11:13:59', 1170 FROM dual UNION ALL SELECT 'C품목', '20211104', '08:43:54', 234 FROM dual UNION ALL SELECT 'C품목', '20211104', '09:01:21', 763 FROM dual UNION ALL SELECT 'C품목', '20211104', '09:13:55', 517 FROM dual UNION ALL SELECT 'C품목', '20211104', '09:38:57', 1035 FROM dual UNION ALL SELECT 'C품목', '20211104', '09:43:56', 218 FROM dual UNION ALL SELECT 'C품목', '20211104', '10:13:56', 1270 FROM dual ) SELECT a.line, a.item, a.dt, LAG(SUBSTR(b.tm, 1, 5), 1, a.stm) OVER ( PARTITION BY a.line, a.item ORDER BY b.tm ) stm, SUBSTR(b.tm, 1, 5) etm, TO_CHAR(timediff(TO_time(SUBSTR(b.tm, 1, 5), 'hh24:mi'),TO_time(LAG(SUBSTR(b.tm, 1, 5), 1, a.stm) OVER ( PARTITION BY a.line, a.item ORDER BY b.tm ), 'hh24:mi')), 'hh24:mi') tm, b.qty FROM tab_a a, tab_b b WHERE a.item = b.item AND a.dt = b.dt AND SUBSTR(b.tm, 1, 5) BETWEEN a.stm AND a.etm;