2014-12-03 5 views
1

Я знаю, что это относительно просто, но я не могу найти решение в архивах, хотя я вижу похожие, но мой SQL недостаточно адекватен, чтобы перепроектировать их.Количество записей, зарегистрированных в неделю - Oracle SQL

Все, что я пытаюсь сделать, это подсчитать количество вызовов, поднятых в команде, сгруппированной по неделям из таблицы управления вызовами. Вот пример некоторого кода, который возвращает счетчик 30 000 плюс записи. Я хотел бы видеть, что это число делится на недели, а также, возможно, дни, основанные на пятницах до пятницы, если это возможно?

 
select COUNT(*) from opencall 
where 
trunc(to_date(substr(LOGDATE,1,10), 'DD-MM-YY')) BETWEEN '01-JAN-14' AND '31-DEC-14' 

Ключевые поля

 
logdate 

Имя таблицы является

 
opencall 

Так что может создать список из числа вызовов вошедшего этой suppgroup в неделю так

 
Week  Calls Logged 
Week 1  134 
Week 2  135 
Week 3  189 
... 
... 

Так просто, но я мог бы использовать этот код для поиска по всем различным полям, чтобы идентифицировать некоторые шаблоны.

Все наши даты поля VARCHAR2 (20 BYTE)

я группа этот счет в день достаточно просто, используя

 
    select COUNT(*), trunc(to_date(substr(LOGDATE,1,10), 'DD-MM-YY'))
from opencall where trunc(to_date(substr(LOGDATE,1,10), 'DD-MM-YY')) BETWEEN '01-JAN-14' AND '31-DEC-14' group by trunc(to_date(substr(LOGDATE,1,10), 'DD-MM-YY')) order by trunc(to_date(substr(LOGDATE,1,10), 'DD-MM-YY'))

Надеюсь кто-то может помочь.

ответ

0

Для подсчета както недели вы должны группа по trunc(your_date, 'IW'), но если вы хотите для пятницы к пятнице вы должны использовать next_day функцию, а затем группу по trunc(NEXT_DAY(your_date,'FRIDAY'), 'IW') так, ваш запрос должен быть чем-то вроде этого:

select 
'WEEK '|| row_number() over(order by trunc(NEXT_DAY(to_date(substr(LOGDATE,1,10), 'DD-MM-YY'),'FRIDAY'), 'IW')) WEEK, 
count(*) Calls Logged 
from opencall 
where trunc(to_date(substr(LOGDATE,1,10), 'DD-MM-YY')) BETWEEN '01-JAN-14' AND '31-DEC-14' 
group by trunc(NEXT_DAY(to_date(substr(LOGDATE,1,10), 'DD-MM-YY'),'FRIDAY'), 'IW') 
order by trunc(NEXT_DAY(to_date(substr(LOGDATE,1,10), 'DD-MM-YY'),'FRIDAY'), 'IW'); 
+0

Отличное и блестящее решение. Я могу использовать это как основу для того, чтобы так много вызовов теперь фильтровались на всевозможные поля. Спасибо большое. –

0

Просто удалите closedby из запроса:

with closed_calls as (
     select to_number(to_char(closedate, 'IW') as week_number, oc.* 
     from opencall oc 
     where ((status > 15 or status = 6) and 
       closedby in ('analyst1', 'analyst2', 'analyst3', 'analyst4', 'analyst5', 'analyst6', 'analyst7') and 
       trunc(closeddate) between date '2014-10-01' and date '2014-12-31' 
    ) 
select week_number as "Week number", count(*) as "Calls closed" 
from closed_calls 
group by week_number 
order by week_number desc; 

Обратите внимание, что я изменил дату арифметику. Предположительно, closedate хранится в качестве даты/времени в базе данных. Если это так, вам не нужно преобразовывать его в строку для сравнения.

+0

Эй там, спасибо за ваш вклад. Это, похоже, жалуется на недостающие правильные круглые скобки. Я попытался добавить один ... ORA-00907: отсутствует правая скобка 00907. 00000 - «Отсутствие правильной круглой скобки» * Причина: * Действие: Ошибка в строке: 2 Столбец: 50 –

+0

Закрыто на самом деле VARCHAR2 (20 BYTE) –

Смежные вопросы