Вычисление средней скорости закрытия обращения

Добрый день, Коллеги!
Возникла потребность в настройке итога для обращений (тип показатель) для вычисления "средней скорости закрытия обращения".

Необходимо для объекта "Жизненный цикл обращения" по колонке "Продолжительность часов" высчитать среднее значение времени, а именно "как быстро обращение перешло из состояния Новое на одну из завершающих стадий (включая время нахождения на промежуточных этапах по отдельности) Закрыто или Отменено".

Вопрос в следующем:
Возможно ли настроить фильтрацию таким образом, что бы захватывать общую, среднюю продолжительность времени для всех обращений, по всем состояниям кроме "Закрыт" (т.к. в базе в колонке EndDate всегда будет NULL для стадии закрыт)?

Аналогичная вопрос о настройке фильтрации возникает с записями в объекте CaseLifecycle для случая, когда Новое обращение было взято "В работу", а затем "Отменено", так как в базе будет существовать три записи, но для конечной стадии Отменено EndDate = NULL.

Как именно в таком случае будет вычисляться среднее значение по нескольким записям CaseLifecycle и Case, если EndDate = NULL? Будет ли прибавляться просто 0 часов и учитываться в количестве записей жизненного цикла при расчёте среднего?

Возможно кто-то уже сталкивался с подобной задачей.
На скриншоте приведена попытка настройки итога.
Заранее спасибо!

Нравится

5 комментариев

Здравствуйте!

Базовыми средствами системы реализовать задачу можно, но нужно немного новых объектов и SQL запросов.

Построенная аналитика не совсем корректна - она отображает среднее время нахождения обращения на какой-то из стадий (то есть, отображается среднее значение, но не требуемое).

Для решения необходимо создать промежуточное представление, в котором будет храниться требуемая информация. Для этого:
1) Перейдите в конфигурацию
2) Создайте объект (назовем его UsrMyVwObject с заголовком "Объект для моей аналитики"), унаследовавшись от базового, добавьте два поля:

  1. Обращение (справочное с ссылкой на объект "Обращение") - с названием Case
  2. Суммарное время обработки (целое число) - с названием TotalSolution

В свойствах объекта укажите признак "Представление в БД"
3) Опубликуйте объект
4) Создайте представление в БД запросом:

create view UsrMyVwObject
as
select NEWID() "Id", c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id "CaseId", sum(StateDurationInMinutes) "TotalSolution"
from "Case" c
join CaseLifecycle
on CaseLifecycle.CaseId = c.Id
group by Id, c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id

5) Стройте аналитику по созданному объекту - необходимо посчитать среднее значение по полю TotalSolution.
В фильтре аналитики необходимо указать условие, что учитываются только обращения в конечном состоянии, так как незавершенные обращения не должны влиять на построение статистики.

P.S. SQL запрос не проверял - рекомендую самостоятельно проработать его.

Алексей, ещё раз добрый день!
Спасибо огромное за комментарий, попробовали реализовать.
Создали объект UsrAverageCloseSpeed
И две колонки
UsrTotalSolution - дробное число
UsrCase - справочное поле с ссылкой на обращение.
Возникли трудности именно с созданием представления в БД. Попробовали доработать согласно вашим рекомендациям SQL мкрипт, но проверка заканчивается с ошибкой Ambiguous column name "Id"

CREATE VIEW UsrAverageCloseSpeed
AS
SELECT NEWID() Id, c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id, sum(clc.StateDurationInMinutes)
FROM [ofd_dev].[dbo].[Case] c
JOIN [ofd_dev].[dbo].[CaseLifecycle] clc
ON clc.CaseId = c.Id
GROUP BY Id, c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id

Просим помочь разобраться или детальнее объяснить структуру SQL создания представления БД.
Заранее спасибо!

UPDATE
Перечитал я что написал с вечера, немного исправлю(кстати, первые два пункта были в изначальном запросе).
1) как правильно указал коллега ниже, нельзя создать 2 колонки с Id, c.Id AS CaseId вполне сработает.
2) нельзя также оставить последнюю колонку без имени, так как это view, нужно сделать примерно так:
SUM(clc.StateDurationInMinutes) AS TotalSolution
3) GROUP BY Id сделать точно не получится, так как GROUP BY еще об этом алиасе ничего не знает, фактически, еще даже newid() в этот момент не отработала, его нужно просто убрать.
Итого:

CREATE VIEW UsrAverageCloseSpeed
AS
SELECT NEWID() AS Id, c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id AS CaseId, SUM(clc.StateDurationInMinutes) AS TotalSolution
FROM [Case] c
JOIN CaseLifecycle clc
ON clc.CaseId = c.Id
GROUP BY c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id

Вот такой запрос на моей базе успешно отработал.
P.S. Рекомендую Case взять в квадратны скобки, так это еще и зарезервированное слово в SQL.

"Титаев Александр Николаевич" написал:Просим помочь разобраться или детальнее объяснить структуру SQL создания представления БД.
Заранее спасибо!

Ну логично, вы пытаетесь создать вью с двумя одноименными колонками, что ваша первая Id что c.Id в результирующем запросе будут называтся Id. Так нельзя. Можно вроде этого:

CREATE VIEW UsrAverageCloseSpeed
AS
SELECT NEWID() Id, c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id as UsrCaseId, sum(clc.StateDurationInMinutes)
FROM [ofd_dev].[dbo].[Case] c
JOIN [ofd_dev].[dbo].[CaseLifecycle] clc
ON clc.CaseId = c.Id
GROUP BY Id, c.CreatedOn, c.CreatedById, c.ModifiedOn, c.ModifiedById, c.Id

Ну и в объекте который вы будете поверх вью в бпм, последнюю колонку так же нужно будет назвать UsrCaseId, ну или как вы захотите, но отлично от Id

upd, так же упустил пункты 2.3. описанные выше Ильей, почитайте их ;)

Коллеги, спасибо большое за оказанную помощь!
Разобрались и дополнили)

Показать все комментарии