Агрегирование в CASE - PullRequest
       6

Агрегирование в CASE

0 голосов
/ 15 ноября 2018

У меня есть две таблицы, одна для хранения запросов (e_key) и одна для хранения событий, прикрепленных к этому запросу.Этим событиям назначены отрезки времени.Я хочу сложить общее время, приложенное к запросу, а затем использовать CASE, чтобы назначить его одной из трех категорий размеров, которые я использую в качестве оси X на гистограмме.

Я использую эточтобы настроить поле «Измерение» в программном обеспечении для построения диаграмм, которое мы интегрируем в качестве моего выбора:

CASE WHEN SUM(Events.EVENT_TIME_SPENT) < 1 THEN 'a. Light Touch' WHEN SUM(Events.EVENT_TIME_SPENT) >= 1 AND SUM(Events.EVENT_TIME_SPENT) < 3 THEN 'b. Medium Intensity' WHEN SUM(Events.EVENT_TIME_SPENT) >= 3 THEN 'c. High Intensity' ELSE 'Unspecified' END

, и я получаю «агрегатная функция недопустима в контексте, в котором она была вызвана».Это потому, что когда выборка копируется в GROUP BY, ему не нравится использование SUM ().

Это полный SQL-код, который генерирует диаграмма (счетчик e_key по оси y, диапазон размеров по xось):

SELECT COUNT(distinct(Enquiry.E_KEY)) AS S1, CASE WHEN SUM(Events.EVENT_TIME_SPENT) < 1 THEN 'a. Low Intensity' WHEN SUM(Events.EVENT_TIME_SPENT) >= 1 AND SUM(Events.EVENT_TIME_SPENT) < 3 THEN 'b. Medium Intensity' WHEN SUM(Events.EVENT_TIME_SPENT) >= 3 THEN 'c. High Intensity' ELSE 'Unspecified' END AS D1
FROM 
   DB2ADMIN.F_ENQUIRY Enquiry
   LEFT JOIN DB2ADMIN.F_EVENTS Events ON Enquiry.E_KEY = Events.EVENT_KEY
    JOIN DB2ADMIN.F_PRIORITY EnquiryType ON Enquiry.E_PRIORITY_LINK = EnquiryType.PRIORITY_NO
WHERE 
   (EnquiryType.PRIORITY_NAME =  'Enquiry'  ) 
AND   (Enquiry.e_job_type_link=0)
AND   (Events.EVENT_TYPE=2)
GROUP BY CASE WHEN SUM(Events.EVENT_TIME_SPENT) < 1 THEN 'a. Low Intensity' WHEN SUM(Events.EVENT_TIME_SPENT) >= 1 AND SUM(Events.EVENT_TIME_SPENT) < 3 THEN 'b. Medium Intensity' WHEN SUM(Events.EVENT_TIME_SPENT) >= 3 THEN 'c. High Intensity' ELSE 'Unspecified' END
ORDER BY CASE WHEN SUM(Events.EVENT_TIME_SPENT) < 1 THEN 'a. Low Intensity' WHEN SUM(Events.EVENT_TIME_SPENT) >= 1 AND SUM(Events.EVENT_TIME_SPENT) < 3 THEN 'b. Medium Intensity' WHEN SUM(Events.EVENT_TIME_SPENT) >= 3 THEN 'c. High Intensity' ELSE 'Unspecified' END

Я не могу отделить SELECT от секции GROUP BY с помощью интерфейса.Есть идеи о том, как этого добиться?Если для параметра «Тип» выбрано «Измерение», а не «Измерение», он будет работать, как и ожидалось, но я не смогу использовать его на оси х.Если я установлю то же поле, исключая SUM (), вокруг EVENT_TIME_SPENT, это позволит мне установить Тип в Измерение и все еще работать.

1 Ответ

0 голосов
/ 15 ноября 2018

Вам не нужны агрегаты в GROUP BY.

Как так, вам нужна только одна строка назад?

SELECT COUNT(distinct(E_KEY)) AS S1
,      CASE WHEN SUM(Events.EVENT_TIME_SPENT) < 1 THEN 'a. Low Intensity' 
           WHEN SUM(Events.EVENT_TIME_SPENT) >= 1 AND SUM(Events.EVENT_TIME_SPENT) < 3 
            THEN 'b. Medium Intensity'
           WHEN SUM(Events.EVENT_TIME_SPENT) >= 3 THEN 'c. High Intensity' 
           ELSE 'Unspecified' END AS D1
FROM 
   TABLE(VALUES(1,1),(1,2),(2,2)) AS Events (E_KEY, EVENT_TIME_SPENT)

, которая возвращает

 S1     D1
 --     -----------------
  2     c. High Intensity

если вы хотите сгруппировать что-то, то, например, это работает

SELECT E_KEY AS S1
,      CASE WHEN SUM(Events.EVENT_TIME_SPENT) < 1 THEN 'a. Low Intensity' 
           WHEN SUM(Events.EVENT_TIME_SPENT) >= 1 AND SUM(Events.EVENT_TIME_SPENT) < 3 
            THEN 'b. Medium Intensity'
           WHEN SUM(Events.EVENT_TIME_SPENT) >= 3 THEN 'c. High Intensity' 
           ELSE 'Unspecified' END AS D1
FROM 
   TABLE(VALUES(1,1),(1,2),(2,2)) AS Events (E_KEY, EVENT_TIME_SPENT)
GROUP BY
    E_KEY


 S1     D1
 --     -------------------
  1     c. High Intensity
  2     b. Medium Intensity

или если вы не хотите SUM () чем-то EVENT_TIME_SPENT, вы можете быть после этого

SELECT COUNT(DISTINCT E_KEY) AS S1
,      CASE WHEN Events.EVENT_TIME_SPENT < 1 THEN 'a. Low Intensity' 
           WHEN Events.EVENT_TIME_SPENT >= 1 AND Events.EVENT_TIME_SPENT < 3 
            THEN 'b. Medium Intensity'
           WHEN Events.EVENT_TIME_SPENT >= 3 THEN 'c. High Intensity' 
           ELSE 'Unspecified' END AS D1
FROM 
   TABLE(VALUES(1,1),(1,2),(2,2),(2,0),(1,4)) AS Events (E_KEY, EVENT_TIME_SPENT)
GROUP BY
    CASE WHEN Events.EVENT_TIME_SPENT < 1 THEN 'a. Low Intensity' 
           WHEN Events.EVENT_TIME_SPENT >= 1 AND Events.EVENT_TIME_SPENT < 3 
            THEN 'b. Medium Intensity'
           WHEN Events.EVENT_TIME_SPENT >= 3 THEN 'c. High Intensity' 
           ELSE 'Unspecified' END

 S1 D1
 -- -------------------
  1 a. Low Intensity   
  2 b. Medium Intensity
  1 c. High Intensity  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...