Стол _helper_calendar - простая вспомогательная таблица для заполнения пробелов в дате без каких-либо результатов. Поэтому я получаю каждую дату между датой начала и окончания.
Я добавил объяснение каждой строке кода, чтобы ее ясное, чего я пытаюсь достичь. Я действительно вернусь к ошибке: "invalide use group function..."
Вот мой запрос:
SELECT
/*get the day date*/
cal.datefield AS cal_date,
/*get appointments by date from user*/
(SELECT COUNT(e1.id) FROM events_table e1 WHERE DATE(e1.start) = DATE(cal.datefield) AND e1.user_id = 1 ) AS appointments,
/*get sales by date from user*/
(SELECT COUNT(s1.id) FROM sales_table s1 WHERE DATE(s1.created) = DATE(cal.datefield) AND s1.user_id = 1) AS sales,
/*get average appointments by date from all users*/
(SELECT COUNT(e2.id) FROM events_table e2 WHERE DATE(e2.start) = DATE(cal.datefield) ) AS appointments_avg,
/*get average sales by date from all users*/
(SELECT AVG(COUNT(s2.id)) FROM sales_table s2 WHERE DATE(s2.created) = DATE(cal.datefield)) AS sales_avg
FROM events_table e
RIGHT JOIN _helper_calendar AS cal ON (DATE(e.start) = cal.datefield)
WHERE DATE(cal.datefield) BETWEEN '2018-06-01' AND '2018-07-31'
GROUP BY cal_date
Вот более короткий запрос, который вызывает ту же ошибку. Конечно, мне нужно, чтобы он работал в том же контексте, что и выше, но, может быть, это помогает лучше понять?
SELECT s.start, AVG(COUNT(s.id)) s2_cnt FROM sales_table s WHERE DATE(s.start) BETWEEN '2018-06-01' AND '2018-07-31' GROUP BY DATE(s.start);
Что я делаю неправильно?
Перепишите свой запрос, используя левые соединения из таблицы календаря, в другие таблицы и с помощью группировки совокупных функций по дате:
SELECT
cal.datefield AS cal_date,
COUNT(e1.id) AS appointments,
COUNT(s1.id) AS sales
FROM _helper_calendar AS cal
LEFT JOIN events_table e ON DATE(e.start) = cal.datefield
LEFT JOIN events_table e1 ON DATE(e1.start) = DATE(cal.datefield)
AND e1.user_id = 1
LEFT JOIN salestable ON DATE(s1.created) = DATE(cal.datefield)
AND s1.user_id = 1
WHERE DATE(cal.datefield) BETWEEN '2018-06-01' AND '2018-07-31'
GROUP BY cal.datefield
и присоедините этот запрос к другому запросу, который получает среднее значение для всех пользователей для каждой даты присоединения к дате.
COUNT
вместоAVG
дляappointments_avg