Mysql ... Невозможный запрос? - PullRequest
0 голосов
/ 17 апреля 2020

Сложный запрос. Не уверен, что это возможно.

Я пытаюсь выяснить, как отформатировать запрос, который должен выполнить sh несколько вещей.

(1) Мне нужно проанализировать поле DATE это поле VARCHAR, а не поле sql для получения месяца каждой даты.

(2) Затем мне нужно AVG все поля PTS по ИМЯ и Месяцу. Таким образом, с данными моего примера ниже, у меня будет строка, в которой Джон и Джон будут иметь 2 в столбце JAN и 3 в столбце APR, а столбец AVG будет представлять собой среднее значение за все месяцы. Таким образом, месяцы являются средним значением всех записей в этом месяце, а столбец AVG является средним значением всех столбцов в строке.

Таблица:

Name (VARCAHR)  PTS (INT) DATE (VARCHAR)        
---------------------------------------------
John            3           Tue Apr 14 17:56:02 2020
Chris           2           Tue Apr 14 19:44:03 2020
John            2           Mon Jan 30 15:23:03 2020
Chris           4           Fri Feb 28 16:15:15 2020
John            3           Tue Apr 14 17:56:02 2020


Table Layout on web page:
Name        Jan     Feb     Mar     Apr     May     Jun     Jul     Aug     Sep     Oct     Nov     Dec     Average

1 Ответ

3 голосов
/ 17 апреля 2020

Не невозможно, просто запутанно. Вы можете использовать STR_TO_DATE для преобразования ваших строк в DATETIME объекты, из которых затем вы можете использовать MONTH для получения номера месяца. Обратите внимание, хотя (как прокомментировал @DRapp), что вы должны хранить DATETIME значения в их исходной форме, а не как VARCHAR, тогда вам не придется иметь дело с STR_TO_DATE. Получив номер месяца, вы можете использовать условное агрегирование для получения желаемых результатов:

SELECT name,
       COALESCE(AVG(CASE WHEN mth = 1 THEN PTS END), 0) AS Jan,
       COALESCE(AVG(CASE WHEN mth = 2 THEN PTS END), 0) AS Feb,
       COALESCE(AVG(CASE WHEN mth = 3 THEN PTS END), 0) AS Mar,
       COALESCE(AVG(CASE WHEN mth = 4 THEN PTS END), 0) AS Apr,
       -- repeat for May to November
       COALESCE(AVG(CASE WHEN mth = 12 THEN PTS END), 0) AS `Dec`,
       AVG(PTS) AS AVG
FROM (
  SELECT name, PTS AS PTS, MONTH(STR_TO_DATE(DATE, '%a %b %e %H:%i:%s %Y')) AS mth
  FROM data
) d
GROUP BY name

Вывод (для ваших данных выборки):

name    Jan     Feb     Mar     Apr     Dec     AVG
Chris   0       4       0       2       0       3
John    0       0       0       2.6667  0       2.6667

Демонстрация включена SQLFiddle

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