Благодаря помощи другого пользователя я смог использовать условное агрегирование для получения нужной точки данных. Теперь мне нужно реализовать это в существующем запросе, чтобы получить SLA% для диапазона дат (а не для каждого пакета). Предыдущий пост для справки: Перетащите DATEDIFF между строками с отличным значением и предложением WHERE
Приведенный ниже запрос использовался, когда предполагалось, что 2 отметки времени в PackageTable были достаточно точными для расчета SLA. Поскольку я обнаружил, что это не так, мне нужно выполнить запрос к другой таблице (PackageTable_Audit), которая в основном записывает события в строке, когда пакет перемещается из LifeCycleStatusId = 1 (создание) в LifeCycleStatusId = 3 (назначено) в LifeCycleStatusId = 5 (завершено). Таким образом,% соблюдения SLA - это количество пакетов, которые были завершены в X секундах / всего пакетов. Поскольку я не могу использовать простой DATEDIFF в подзапросе и, следовательно, вынужден использовать агрегатную функцию для получения DATEDIFF между строками, я не уверен, как включить его в запрос.
Я обновил свой старый запрос условным агрегатом, но получаю следующую ошибку:
"Невозможно выполнить агрегатную функцию для выражения, содержащего агрегат или подзапрос."
Запрос:
-- VARIABLE DECLARATION AND INITIALIZATION
DECLARE @StartDate varchar(10);
DECLARE @EndDate varchar(10);
SET @StartDate = '2019-06-01';
SET @EndDate = '2019-06-31';
-- TABLE DECLARATION ##################################################
DECLARE @TABLE1 TABLE("No. Packages in SLA" INT, "Total Packages" INT, "SLA %" FLOAT)
--#####################################################################
-- WHAT GETS INSERTED INTO TABLE 1
INSERT INTO @TABLE1
SELECT
A.NUM, A.DENOM, CAST(A.NUM AS FLOAT)/A.DENOM*100
FROM
(
-- COLUMN SELECTION. TWO NUMBERS WILL REPRESENT A NUM AND A DENOM
SELECT
(SELECT SUM(CASE
WHEN
datediff(second, MAX(CASE WHEN LifeCycleStatusId = 2 THEN rowDateModified END),
MAX(CASE WHEN LifeCycleSTatusId = 5 THEN rowDateModified END)
) < 172800
THEN 1
ELSE 0
END) AS IN_SLA
FROM PackageTable WITH (nolock)
WHERE lifecyclestatusid = 5
AND rowDateCreated BETWEEN @StartDate AND @EndDate)
AS NUM,
(SELECT COUNT(PackageGuid) As No_Packages
FROM PackageTable WITH (nolock)
WHERE lifecyclestatusid = 5
AND rowDateCreated BETWEEN @StartDate AND @EndDate)
AS DENOM
) A
SELECT "No. Packages in SLA", "Total Packages", "SLA %"
FROM @TABLE1