Как я могу получить среднее количество в нескольких таблицах в MySql?

0

Стол _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);

Что я делаю неправильно?

Теги:

1 ответ

0

Перепишите свой запрос, используя левые соединения из таблицы календаря, в другие таблицы и с помощью группировки совокупных функций по дате:

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

и присоедините этот запрос к другому запросу, который получает среднее значение для всех пользователей для каждой даты присоединения к дате.

  • 0
    Можете ли вы привести пример, как переписать с левыми соединениями? Я только что удалил группу По части кода и ошибка остается той же ...?
  • 0
    @jhondano см. обновленный ответ. Я также исправил ошибку в вашем запросе, когда вы использовали COUNT вместо AVG для appointments_avg
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню