Использование условного агрегирования в подзапросе - PullRequest
1 голос
/ 27 июня 2019

Благодаря помощи другого пользователя я смог использовать условное агрегирование для получения нужной точки данных. Теперь мне нужно реализовать это в существующем запросе, чтобы получить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...