Я хочу выбрать дни в месяцах и рассчитывать по четырем временным группам по дням - PullRequest
0 голосов
/ 27 июня 2018

Проблема с диапазоном «ТРИ», для подсчета с 22:00 до 06:00 следующего дня, результат будет в предыдущий день, у меня есть этот запрос, который дает мне неверный отчет о данных, любые решения, пожалуйста.

select TRUNC (A.time)+06/24,
       count (distinct B.code)as FOUR,
       count(case when to_char(A.time,'HH24:MI:SS') between '06:00:00'
                                                        and '14:00:00'
                  then A.sn end) as ONE,
       count(case when to_char(A.time,'HH24:MI:SS') between '14:00:00'
                                                        and '22:00:00'
                  then A.sn end) as TWO,
       count(case when A.time between TO_DATE ('10:00:00 PM', 'hh:mi:ss AM')
                                  and TO_DATE ('10:00:00 PM', 'hh:mi:ss AM')+6/24
                  then A.sn end) as THREE
from   B
inner join A
  on B.bol_id = A.bol_id
where  B.group = '9'
and    A.time between '01-JUN-18 06:00:00' and '25-JUN-18 06:00:00'
GROUP BY TRUNC (A.time)

я хочу, чтобы структура была такой пример

1 Ответ

0 голосов
/ 27 июня 2018

Ваша проблема в GROUP BY TRUNC (A.time) - это говорит о том, что нужно начинать окно для каждой строки / дня в полночь и заканчивать в 11:59 следующей ночью. Но вы хотите это с 6 утра текущего дня до 5:59 утра следующего дня. Итак, вы хотите GROUP BY TRUNC(A.time - 6/24) - таким образом, 5:59 сегодня утром будет засчитано как вчера, а 5:59 завтра будет засчитано как сегодня.

Тогда вы можете изменить ваш случай THREE на:

count(case when to_char(A.time,'HH24:MI:SS') > '22:00:00'
             or to_char(A.time,'HH24:MI:SS') < '06:00:00'
           then A.sn end) as THREE

Попробуйте и дайте нам знать, если у вас возникнут проблемы.

select TRUNC(A.time-(6/24)),
       count (distinct B.code)as FOUR,
       count(case when to_char(A.time,'HH24:MI:SS') between '06:00:00'
                                                        and '14:00:00'
                  then A.sn end) as ONE,
       count(case when to_char(A.time,'HH24:MI:SS') between '14:00:00'
                                                        and '22:00:00'
                  then A.sn end) as TWO,
       count(case when to_char(A.time,'HH24:MI:SS') > '22:00:00'
                     or to_char(A.time,'HH24:MI:SS') < '06:00:00'
                   then A.sn end) as THREE
from   B
inner join A
  on B.bol_id = A.bol_id
where  B.group = '9'
and    A.time between '01-JUN-18 06:00:00' and '25-JUN-18 06:00:00'
GROUP BY TRUNC(A.time-(6/24))

Вы также можете изменить ваши дела с between на > and <=. between X and Y включает в себя оба конечных значения, поэтому любые события, происходящие ровно в 2 часа дня, будут дважды учитываться как ОДИН и ДВУХ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...