근무조별 시간에 따른 실적 집계 쿼리 0 1 4,977

by 쿼리바보 [SQL Query] [2024.07.22 11:03:11]


안녕하세요 
SQL 쿼리 작성중 어려운 부분이 있어서 문의해 봅니다.

요일별 근무조의 근무 시간이 작성된 테이블이 있습니다.

TBL_SHIFT

SHIFT_CD DAY_TYPE START_TIME SART_TIME_DAY_TYPE END_TIME END_TIME_DAY_TYPE
FRI1_S1 FRI 0630 D 1500 D
FRI1_S2 FRI 1500 D 2300 D
FRI1_S3 FRI 2300 D 0630 D1
NOR1_S1 NOR 0630 D 1430 D
NOR1_S2 NOR 1430 D 2230 D
NOR1_S3 NOR 2230 D 0630 D1
SAT6_S1 SAT 0630 D 1130 D
SAT6_S2 SAT 1130 D 1630 D
SAT6_S3 SAT 1630 D 2130 D

 

테이블의 구성은 FRI 금요일과 SAT 토요일을 제외한 일자는 NOR로 조를 구성하고 있습니다.

각조의 업무 시작시간(START_TIME) 과 종료시간(END_TIME)으로 구성되어 있으며
3번째 조(S3)의 경우 종료시간 다음날 0630 입니다. 구분을 위해 END_TIME_DAY_TYPE에 당일일 경우 'D', 익일일경우 'D1'으로 표기 하고 있습니다.
그러니까 화~토요일 0630 이전은 이전일 3조의 근무시간 입니다.  

 

TBL_WORK_PLAN        
PLAN_WORK_DT ITEM_CD PLANT_QTY RESULT_QTY COMP_YN
20240717 ITEM_A 120 0 N
20240717 ITEM_B 120 0 N
20240718 ITEM_A 120 0 N
20240718 ITEM_B 120 0 N
20240719 ITEM_A 120 0 N
20240719 ITEM_C 110 0

N

 

품목별 작업계획 테이블이 있습니다.

실적 테이블

TBL_WORK_RESULT      
WORK_YMD WORK_HMS ITEM_CD RESULT_QTY
20240717 063832 ITEM_A 10
20240717 063925 ITEM_B 12
20240717 064002 ITEM_A 2
20240717 091002 ITME_A 48
20240717 093020 ITEM_A 24
20240717 094002 ITEM_B 24
20240717 134002 ITEM_A 12
20240717 142000 ITEM_B 12
20240717 230000 ITEM_A 2
20240717 235021 ITEM_B 20
20240718 002000 ITEM_A 12
20240718 032300 ITEM_B 20
20240718 042240 ITEM_B 10
20240718 062258 ITEM_A 10
20240718 063140 ITEM_B 13
20240718 063640 ITEM_B 12
20240718 064240 ITEM_A 10
20240718 065240 ITEM_A 10
20240718 063832 ITEM_A 10
20240718 063925 ITEM_B 12
20240718 064002 ITEM_A 2
20240718 091002 ITME_A 48
20240718 093020 ITEM_A 24
20240718 094002 ITEM_B 24
20240718 134002 ITEM_A 12
20240718 142000 ITEM_B 12
20240718 230000 ITEM_A 2
20240718 235021 ITEM_B 20
20240718 002000 ITEM_A 12
20240718 032300 ITEM_B 20
20240718 042240 ITEM_B 10
20240718 062258 ITEM_A 10
20240718 063140 ITEM_A 13
20240718 063640 ITEM_C 12
20240718 064240 ITEM_C 10
20240718 065240 ITEM_A 10

이 있습니다.

실적 테이블은 작업한 품목의 실제 날짜와 시간, 수량을 등록 하고 있습니다..

실적 등록시 조별로 등록 하는게 아니라 기계에 찍힌 일자와 시간만으로 등록을 하고 있어서

실적을 집계시 해당 실적이 어떤 계획일의 실적인지를 TBL_SHIFT를 참조해서 가지고 오려고 합니다.

 

결과적으로 계획 테이블에 

TBL_WORK_PLAN        
PLAN_WORK_DT ITEM_CD PLANT_QTY RESULT_QTY COMP_YN
20240717 ITEM_A 120 120 Y
20240717 ITEM_B 120 98 N
20240718 ITEM_A 120 130 Y
20240718 ITEM_B 120 123 Y
20240719 ITEM_A 120 33 N
20240719 ITEM_C 110 22 N

 

집계를 하고 싶은데,
TBL_SHIFT를 참조해서 실적일자와 시간으로 실제 실적이 집계될 계획일을 어떻게 구하면 좋을지 조언 부탁드립니다.

by 마농 [2024.07.23 08:31:44]
WITH tbl_shift(shift_cd, day_type, start_time, sart_time_day_type, end_time, end_time_day_type) AS
(
          SELECT 'FRI1_S1', 'FRI', '0630', 'D', '1500', 'D'  FROM dual
UNION ALL SELECT 'FRI1_S2', 'FRI', '1500', 'D', '2300', 'D'  FROM dual
UNION ALL SELECT 'FRI1_S3', 'FRI', '2300', 'D', '0630', 'D1' FROM dual
UNION ALL SELECT 'NOR1_S1', 'NOR', '0630', 'D', '1430', 'D'  FROM dual
UNION ALL SELECT 'NOR1_S2', 'NOR', '1430', 'D', '2230', 'D'  FROM dual
UNION ALL SELECT 'NOR1_S3', 'NOR', '2230', 'D', '0630', 'D1' FROM dual
UNION ALL SELECT 'SAT6_S1', 'SAT', '0630', 'D', '1130', 'D'  FROM dual
UNION ALL SELECT 'SAT6_S2', 'SAT', '1130', 'D', '1630', 'D'  FROM dual
UNION ALL SELECT 'SAT6_S3', 'SAT', '1630', 'D', '2130', 'D'  FROM dual
)
, tbl_work_plan(plan_work_dt, item_cd, plant_qty, result_qty, comp_yn) AS
(
          SELECT '20240717', 'ITEM_A', 120, 0, 'N' FROM dual
UNION ALL SELECT '20240717', 'ITEM_B', 120, 0, 'N' FROM dual
UNION ALL SELECT '20240718', 'ITEM_A', 120, 0, 'N' FROM dual
UNION ALL SELECT '20240718', 'ITEM_B', 120, 0, 'N' FROM dual
UNION ALL SELECT '20240719', 'ITEM_A', 120, 0, 'N' FROM dual
UNION ALL SELECT '20240719', 'ITEM_C', 110, 0, 'N' FROM dual
)
, tbl_work_result(work_ymd, work_hms, item_cd, result_qty) AS
(
          SELECT '20240717', '063832', 'ITEM_A', 10 FROM dual
UNION ALL SELECT '20240717', '063925', 'ITEM_B', 12 FROM dual
UNION ALL SELECT '20240717', '064002', 'ITEM_A',  2 FROM dual
UNION ALL SELECT '20240717', '091002', 'ITEM_A', 48 FROM dual
UNION ALL SELECT '20240717', '093020', 'ITEM_A', 24 FROM dual
UNION ALL SELECT '20240717', '094002', 'ITEM_B', 24 FROM dual
UNION ALL SELECT '20240717', '134002', 'ITEM_A', 12 FROM dual
UNION ALL SELECT '20240717', '142000', 'ITEM_B', 12 FROM dual
UNION ALL SELECT '20240717', '230000', 'ITEM_A',  2 FROM dual
UNION ALL SELECT '20240717', '235021', 'ITEM_B', 20 FROM dual
UNION ALL SELECT '20240718', '002000', 'ITEM_A', 12 FROM dual
UNION ALL SELECT '20240718', '032300', 'ITEM_B', 20 FROM dual
UNION ALL SELECT '20240718', '042240', 'ITEM_B', 10 FROM dual
UNION ALL SELECT '20240718', '062258', 'ITEM_A', 10 FROM dual
UNION ALL SELECT '20240718', '063140', 'ITEM_B', 13 FROM dual
UNION ALL SELECT '20240718', '063640', 'ITEM_B', 12 FROM dual
UNION ALL SELECT '20240718', '064240', 'ITEM_A', 10 FROM dual
UNION ALL SELECT '20240718', '065240', 'ITEM_A', 10 FROM dual
UNION ALL SELECT '20240718', '063832', 'ITEM_A', 10 FROM dual
UNION ALL SELECT '20240718', '063925', 'ITEM_B', 12 FROM dual
UNION ALL SELECT '20240718', '064002', 'ITEM_A',  2 FROM dual
UNION ALL SELECT '20240718', '091002', 'ITEM_A', 48 FROM dual
UNION ALL SELECT '20240718', '093020', 'ITEM_A', 24 FROM dual
UNION ALL SELECT '20240718', '094002', 'ITEM_B', 24 FROM dual
UNION ALL SELECT '20240718', '134002', 'ITEM_A', 12 FROM dual
UNION ALL SELECT '20240718', '142000', 'ITEM_B', 12 FROM dual
UNION ALL SELECT '20240718', '230000', 'ITEM_A',  2 FROM dual
UNION ALL SELECT '20240718', '235021', 'ITEM_B', 20 FROM dual
UNION ALL SELECT '20240718', '002000', 'ITEM_A', 12 FROM dual
UNION ALL SELECT '20240718', '032300', 'ITEM_B', 20 FROM dual
UNION ALL SELECT '20240718', '042240', 'ITEM_B', 10 FROM dual
UNION ALL SELECT '20240718', '062258', 'ITEM_A', 10 FROM dual
UNION ALL SELECT '20240718', '063140', 'ITEM_A', 13 FROM dual
UNION ALL SELECT '20240718', '063640', 'ITEM_C', 12 FROM dual
UNION ALL SELECT '20240718', '064240', 'ITEM_C', 10 FROM dual
UNION ALL SELECT '20240718', '065240', 'ITEM_A', 10 FROM dual
)
SELECT a.plan_work_dt, a.item_cd, a.plant_qty
     , SUM(b.result_qty) result_qty
     , CASE WHEN SUM(b.result_qty) >= a.plant_qty THEN 'Y' ELSE 'N' END comp_yn
  FROM (SELECT a.plan_work_dt, a.item_cd, a.plant_qty
             , MIN(DECODE(NVL(c.sart_time_day_type, b.sart_time_day_type)
                   , 'D', a.dt, 'D1', a.dt1) || NVL(c.start_time, b.start_time) || '00') stm
             , MAX(DECODE(NVL(c.end_time_day_type , b.end_time_day_type)
                   , 'D', a.dt, 'D1', a.dt1) || NVL(c.end_time  , b.end_time  ) || '00') etm
          FROM (SELECT plan_work_dt, item_cd, plant_qty
                     , TO_CHAR(TO_DATE(plan_work_dt, 'yyyymmdd')  , 'yyyymmdd') dt
                     , TO_CHAR(TO_DATE(plan_work_dt, 'yyyymmdd')+1, 'yyyymmdd') dt1
                     , TO_CHAR(TO_DATE(plan_work_dt, 'yyyymmdd'), 'DY', 'nls_date_language=American') day_type
                  FROM tbl_work_plan a
                ) a
          LEFT OUTER JOIN tbl_shift b
            ON a.day_type = b.day_type
          LEFT OUTER JOIN tbl_shift c
            ON NVL2(b.day_type, '', 'NOR') = c.day_type
         GROUP BY a.plan_work_dt, a.item_cd, a.plant_qty
        ) a
  LEFT OUTER JOIN tbl_work_result b
    ON a.item_cd = b.item_cd
   AND b.work_ymd || b.work_hms >= a.stm
   AND b.work_ymd || b.work_hms <  a.etm
 GROUP BY a.plan_work_dt, a.item_cd, a.plant_qty
 ORDER BY 1, 2
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입