как сделать запрос на основе сменного графика (день / середина / качели) - PullRequest
1 голос
/ 10 ноября 2019

Мне нужно собрать общее количество билетов, созданных за смену, вместе с промежуточным итогом. У меня есть существующий запрос, который я считаю правильным, но после проверки кажется, что он вытягивает неправильные числа.

    SELECT
    TO_CHAR(TRUNC(DTTM,'Y'),'YYYY') as "DATE"
    ,COUNT(CASE WHEN TO_CHAR(DTTM, 'HH24:MI') BETWEEN '14:00' AND '22:00' THEN TKTNUM ELSE NULL END) AS "DAYS"
    ,COUNT(CASE WHEN TO_CHAR(DTTM, 'HH24:MI') BETWEEN '06:00' AND '14:00' THEN TKTNUM ELSE NULL END) AS "MIDS"
    ,COUNT(CASE WHEN TO_CHAR(DTTM, 'HH24:MI') NOT BETWEEN '06:00' AND '22:00' THEN TKTNUM ELSE NULL END) AS "SWINGS"
    ,COUNT(TKTNUM) "TOTAL"
    ,SUM(COUNT(TKTNUM)) OVER (ORDER BY (TRUNC(E.ESCDTTM,'Y'),'YYYY'))  -- c/o Littlefoot and Stew Ashton 
    FROM TKTCHISTORY 
    GROUP BY TRUNC(E.ESCDTTM,'Y')
    ORDER BY TRUNC(E.ESCDTTM,'Y')

SAMPLE DATA:
TKTNUM  TKT_CREATED
INC0001 01/10/2019 1:00
INC0002 01/10/2019 23:00
INC0003 03/10/2019 5:00
INC0004 03/10/2019 9:20
INC0005 05/11/2019 15:00

DESIRED OUTPUT:
DATE        DAYS    MIDS    SWINGS  TOTAL   
2019-08-01  8       13      1       22      22
2019-08-02  19      5       3       27      49
2019-08-03  23      6       6       35      84
2019-08-04  7       9       13      29      113
2019-08-05  4       17      2       23      136
2019-08-06  10      5       16      31      167
2019-08-07  3       12      11      26      193

«SWINGS» будет получать билеты с 00:00 до 06:00 или с 22:00 до 24:00 в тот же день. Например, билет был сгенерирован 02 ноября 01:00 ... когда я получу отчет, он будет засчитан 02 ноября для SWINGS, когда он должен быть для 01 ноября.

Iпридумал что-то, что, вероятно, помогло бы с логикой, но я не уверен на 100%.

    WITH Shift_Sched (shiftdate,shiftsched) as
    (   
        SELECT 
        --sysdate
        CASE 
                WHEN TO_CHAR(TRUNC(sysdate,'MI'),'HH24:MI')  BETWEEN '06:00' AND '23:59' THEN TRUNC(sysdate,'DD') 
                WHEN TO_CHAR(TRUNC(sysdate,'MI'),'HH24:MI')  BETWEEN '00:00' AND '05:59' THEN TRUNC(sysdate -1,'DD')
        END as "SHIFT DATE",
        CASE 
                WHEN TO_CHAR(TRUNC(sysdate,'MI'),'HH24:MI') BETWEEN '06:00' AND '14:00' THEN 'MIDS' 
                WHEN TO_CHAR(TRUNC(sysdate,'MI'),'HH24:MI') BETWEEN '14:00' AND '22:00' THEN 'DAYS' 
                ELSE 'SWINGS'
        END as "SHIFT SCHED"
        FROM DUAL
    )
    SELECT shiftdate,shiftsched,COUNT(shiftsched)  
    FROM shift_sched
    GROUP by shiftdate,shiftsched

Любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 10 ноября 2019

Если я следил за вами правильно, вам нужны дни с 6 утра до 6 утра следующего дня. Если это так, вы можете вычесть 6 часов до tkt_created, обрезать до сегодняшнего дня и сгруппировать по ним. Остальное - просто условное агрегирование.

select
    trunc(tkt_created - 6/24) "DATE",
    sum(case when extract(hour from tkt_created) between 6 and 13 then 1 end) days,
    sum(case when extract(hour from tkt_created) between 14 and 21 then 1 end) mids,
    sum(case 
        when extract(hour from tkt_created) between 22 and 23
            or extract(hour from tkt_created) between 0 and 5
        then 1 end
    ) swings,
    count(*) total
from tktchistory
group by trunc(tkt_created - 6/24)
order by "DATE"

Примечание: я использовал стандартный SQL extract() вместо to_char(), который специфичен для Oracle;Помимо стандартного, еще одно преимущество состоит в том, что он возвращает целое число, а не строку.

Это также можно сформулировать как:

select
    trunc(tkt_created - 6/24) "DATE",
    sum(case when extract(hour from (tkt_created) between 6 and 13 then 1 end) days,
    sum(case when extract(hour from tkt_created) between 14 and 21 then 1 end) mids,
    sum(case when extract(hour from (tkt_created - 6/24)) between 16 and 23 then 1 end) swings,
    count(*) total
from tktchistory
group by trunc(tkt_created - 6/24)
order by "DATE"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...