시간대별 작업물량 쿼리 0 1 1,594

by 성이 [SQL Query] 오라클 [2022.04.21 08:57:26]


일일 작업TYPE 시간대별 수량 뽑는 쿼리인데 어케어케 원하는대로 정보는 뽑아집니다 혹시 이걸 더 효울적으로 할 수 있는 방법이 있나 문의 드려요
특정 시간대별 (07시부터 19시까지).. 1시간 단위로(정확히는 59분 단위) 작업TYPE별 물량을 뽑는건데

전 하드코딩한 시간을 가로를 세로로 UNPIVOT 시키는고 작업별 물량을 따로 만들어서 해당 작업의 시간(07,08....)과 하드코딩한 시간을 매칭해서 작성했는데요
시간대를 유동적으로 할 수 있는 방법이 있을꺼 같기도 하고 또 전체적으로 더 효율적으로 작성 할 방법이 있나 문의 드립니다.

     시간          DS   LD  MI  MO  GI    GO   합계

07:00 ~ 07:59    0    0    0    0    38     69    107
08:00 ~ 08:59    0    1    0    1    73     99    174
09:00 ~ 09:59    12   0    3    3    130    96    244
10:00 ~ 10:59    9    1    3    1    152    112    278
11:00 ~ 11:59    0    0    1    1    183    158    343
12:00 ~ 12:59    0    0    0    0    201    158    359
13:00 ~ 13:59    5    0    1    1    169    120    296
14:00 ~ 14:59    6    1    1    2    147    121    278
15:00 ~ 15:59    4    4    0    0    151    102    261
16:00 ~ 16:59    1    3    1    0    148    85    238
17:00 ~ 17:59    0    5    0    0    114    77    196
18:00 ~ 18:59    0    0    0    0    40     37     77
총합계            37  15   10   9   1546  1234   2851

-----------------------------------------------------------

SELECT  DECODE(LENGTH(TIMES), 13, TIMES, '총합계') AS TIMES, 
             SUM(job_type.DS) AS "DS (양하)", 
             SUM(job_type.LD) AS "LD (선적)", 
             SUM(job_type.MI) AS "MI (구입)", 
             SUM(job_type.MO) AS "MO (구출)", 
             SUM(job_type.GI) AS "GI (반입)", 
             SUM(job_type.GO) AS "GO (반출)",
             SUM(job_type.DS) + SUM(job_type.LD) + SUM(job_type.MI) + SUM(job_type.MO) + SUM(job_type.GI) + SUM(job_type.GO) AS "합계"
FROM
(
  SELECT 
     SLOT, 
     TIMES
   FROM 
    (
    SELECT 
      '07:00 ~ 07:59' AS T07,
      '08:00 ~ 08:59' AS T08,
      '09:00 ~ 09:59' AS T09,
      '10:00 ~ 10:59' AS T10,
      '11:00 ~ 11:59' AS T11,
      '12:00 ~ 12:59' AS T12,
      '13:00 ~ 13:59' AS T13,
      '14:00 ~ 14:59' AS T14,
      '15:00 ~ 15:59' AS T15,
      '16:00 ~ 16:59' AS T16,
      '17:00 ~ 17:59' AS T17,
      '18:00 ~ 18:59' AS T18
      FROM DUAL
    )
    UNPIVOT
    (
    TIMES FOR SLOT IN(T07,T08,T09,T10,T11,T12,T13,T14,T15,T16,T17,T18)
    )
) slot,
(
SELECT 
     SLOT,
     SUM(DS) AS DS,
     SUM(LD) AS LD,
     SUM(MI) AS MI,
     SUM(MO) AS MO,
     SUM(GI) AS GI,
     SUM(GO) AS GO
FROM (
        SELECT
            SUBSTR(MCH_RMT_STARTTIME, 9, 4) AS SLOT,
            SUM(DECODE(MCH_RMT_JOBTYPE, 'DS', 1, 0)) AS DS,
            SUM(DECODE(MCH_RMT_JOBTYPE, 'LD', 1, 0)) AS LD,
            SUM(DECODE(MCH_RMT_JOBTYPE, 'MI', 1, 0)) AS MI,
            SUM(DECODE(MCH_RMT_JOBTYPE, 'MO', 1, 0)) AS MO,         
            SUM(DECODE(MCH_RMT_JOBTYPE, 'GI', 1, 0)) AS GI,
            SUM(DECODE(MCH_RMT_JOBTYPE, 'GO', 1, 0)) AS GO
        FROM MCH_REMOTE
         WHERE MCH_RMT_STARTTIME >=  '202204150700' AND MCH_RMT_STARTTIME <=  '202204151900'
         AND MCH_RMT_JOBTYPE NOT IN ('AH', 'RH', 'GC', 'MV')
         GROUP BY SUBSTR(MCH_RMT_STARTTIME, 9, 4), MCH_RMT_JOBTYPE 
         ORDER BY MCH_RMT_STARTTIME ASC
) 
GROUP BY SLOT
ORDER BY SLOT
) job_type
WHERE SUBSTR(slot.slot,2,2) = SUBSTR(job_type.slot,1,2)
GROUP BY ROLLUP(TIMES)
ORDER BY TIMES

 

by 마농 [2022.04.22 14:31:28]
SELECT DECODE(GROUPING(SUBSTR(mch_rmt_starttime, 9, 2)), 1, '총합계',
       SUBSTR(mch_rmt_starttime, 9, 2) || ':00 ~ ' ||
       SUBSTR(mch_rmt_starttime, 9, 2) || ':59') times
     , COUNT(DECODE(mch_rmt_jobtype, 'DS', 1)) "DS (양하)"
     , COUNT(DECODE(mch_rmt_jobtype, 'LD', 1)) "LD (선적)"
     , COUNT(DECODE(mch_rmt_jobtype, 'MI', 1)) "MI (구입)"
     , COUNT(DECODE(mch_rmt_jobtype, 'MO', 1)) "MO (구출)"
     , COUNT(DECODE(mch_rmt_jobtype, 'GI', 1)) "GI (반입)"
     , COUNT(DECODE(mch_rmt_jobtype, 'GO', 1)) "GO (반출)"
     , COUNT(*) 합계
  FROM mch_remote
 WHERE mch_rmt_starttime >= '202204150700'
   AND mch_rmt_starttime <  '202204151900'
   AND mch_rmt_jobtype IN ('DS', 'LD', 'MI', 'MO', 'GI', 'GO')
 GROUP BY ROLLUP(SUBSTR(mch_rmt_starttime, 9, 2))
;

 

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