SQL - группировка по последнему дню квартала - PullRequest
1 голос
/ 05 марта 2020

В настоящее время у меня запущен запрос на усреднение результатов опросов операторов. Мы используем диапазон дат LastDayOfTheQuarter и 180 дней назад, чтобы рассчитать эти оценки. Я столкнулся с проблемой для этого текущего квартала.

Один из моих агентов не получал опросов в 2020 году, в результате чего запрос не получает текущий последний день четверти и 180 дней назад результатов.

Код, который я использую:

SELECT
Agent,
U.Position,
U.BranchDescription,
(ADDDATE(LastDayOfQuarter, -180)) AS MinDate, 
(LastDayOfQuarter) AS MaxDate,
COUNT(DISTINCT Response ID) as SurveyCount,
AVG(CASE WHEN Question ID = Q1_2 THEN Answer Value END) AS EngagedScore, 
AVG(CASE WHEN Question ID = Q1_3 THEN Answer Value END) AS KnowledgableScore, 
AVG(CASE WHEN Question ID = Q1_6 THEN Answer Value END) AS ValuedScore
FROM qualtrics_responses
LEFT JOIN date D
ON (D.`Date`) = (DATE(`End Date`))
LEFT JOIN `users` U 
ON U.`UserID` = `Agent ID`
WHERE `Agent` IS NOT NULL 
AND DATE(`End Date`) <= (`LastDayOfQuarter`) 
AND DATE(`End Date`) >= (ADDDATE(`LastDayOfQuarter`, -180))
GROUP BY  `Agent`,  (ADDDATE(`LastDayOfQuarter`, -180))

Я знаю, что проблема связана с тем, как я присоединяюсь к датам, и поскольку у него нет результата в текущем году, объединение даты окончания до даты не захватывает желаемый диапазон дат. Я не могу придумать альтернативы. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 05 марта 2020

Я предполагаю, что таблица date в вашем запросе является календарной таблицей, в которой хранятся начало и конец кварталов (скорее всего, с одной строкой на дату в квартале).

Если это так Вы можете решить эту проблему, переставив join s: сначала cross join пользователей и таблицу календаря, чтобы сгенерировать все возможные комбинации, затем добавьте в таблицу опросов left join:

SELECT
    U.UserID,
    U.Position,
    U.BranchDescription,
    D.LastDayOfQuarter - interval 180 day AS MinDate, 
    D.LastDayOfQuarter AS MaxDate,
    COUNT(DISTINCT Q.ResponseID) as SurveyCount,
    AVG(CASE WHEN Q.QuestionID = 'Q1_2' THEN Q.Answer Value END) AS EngagedScore, 
    AVG(CASE WHEN Q.QuestionID = 'Q1_3' THEN Q.Answer Value END) AS KnowledgableScore, 
    AVG(CASE WHEN Q.QuestionID = 'Q1_6' THEN Q.Answer Value END) AS ValuedScore
FROM date D 
CROSS JOIN users U 
LEFT JOIN qualtrics_responses Q 
    ON  Q.EndDate >= D.Date
    AND Q.EndDate < D.Date + interval 1 day
    AND U.UserID = Q.AgentID
    AND Q.Agent IS NOT NULL
GROUP BY 
    U.UserID,
    U.Position,
    U.BranchDescription,
    D.LastDayOfQuarter

Примечания:

  • Я адаптировал арифметику даты - это предполагает, что вы используете MySQL, поскольку синтаксис запроса предполагает

  • Вы должны квалифицировать все столбцы в запросе, добавив к ним префикс псевдонима таблицы, к которой они принадлежат; это делает запрос намного проще для понимания. Я попробовал, вам, возможно, придется пересмотреть это.

  • Все неагрегированные столбцы должны появляться в предложении group by (см. Также комментарий от Eri c); это требование в большинстве баз данных, и хорошая практика везде

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...