MySQL AVG (КОЛИЧЕСТВО (*) - Заказы Ко дню недельного запроса?

Этот запрос экранировал меня... Я искал веб-работу более чем день теперь, и я попробовал многочисленные вещи.

Я хочу добраться в среднем количество заказов в течение каждого дня недели от моего дб. Я могу вытянуть общее количество # с КОЛИЧЕСТВОМ очень хорошо. Но я просто не могу выяснить, как добраться, AVG РАССЧИТЫВАЮТ на GROUP BY. Я попробовал подзапросы... функционирует... все... ничто не работает..., возможно, кто-то может уступить мне.

Вот запрос, с которого я запустил ниже. Я знаю, что AVG (КОЛИЧЕСТВО (*)) не будет работать, но я оставлю его во что, потому что это показывает то, что я хочу сделать.

SELECT 
    AVG(COUNT(*)) AS avgorders, 
    SUM(total) AS ordertotal, 
    DAYNAME(STR_TO_DATE(order_time,'%m/%d/%Y %H:%i')) AS day 
FROM data 
GROUP BY day 
ORDER BY DAYOFWEEK(STR_TO_DATE(order_time,'%m/%d/%Y %H:%i')) ASC
5
задан Tom Jowitt 31 January 2016 в 00:14
поделиться

3 ответа

То, что вы спрашиваете, не имеет для меня смысла ... AVG - это агрегатная функция, как и COUNT. Что не так с запросом выше, но просто используйте: COUNT (*) AS avgorders?

Допустим, у вас было 3 строки на день 1, 2 строки на день 2, 5 строк на день 3 и 9 строк на день 4 ... вы хотите вернуть результат с одной строкой, который говорит вам:

avgorders   = (3 + 2 + 2 + 5 + 9) / 5 = 21 / 5 = 4.2
ordertotal  = (3 + 2 + 2 + 5 + 9)              = 21

Я не Думаю, вы можете получить это с помощью одного запроса, и вам лучше провести второй раунд агрегации на серверном языке, таком как PHP, оперируя результатами первой агрегации.

0
ответ дан 13 December 2019 в 19:27
поделиться

Мы находимся в подобной ситуации, в которой вы находитесь (вплоть до шаблонов, на которых мы находимся, и шаблонов, на которых мы хотим быть), хотя у нас есть только исходный код в существующем экземпляре Team Foundation Server. Мы планируем выполнить миграцию с Team Foundation Server 2008 на Team Foundation Server 2010, а не модернизацию. Хотя мы еще не сделали этого, у вас есть два варианта, которые вы наметили.

Этот инструмент позволяет перенести исходный код и отслеживание рабочих предметов в новый командный проект. Он будет «сжимать» даты истории, так как TFS захочет добавить собственную метку времени. Будут некоторые потенциальные проблемы истории, из того, что я понимаю. В частности, в TFS 2010 могут возникнуть проблемы при сравнении версий из предварительно перенесенной системы управления версиями. По крайней мере, до сих пор у меня были эксперименты в нашей лаборатории. Насколько я понимаю, эта проблема связана с режимом элемента по сравнению с режимом с интервалами в качестве значений по умолчанию между двумя версиями. Я могу смотреть на отдельные версии и видеть историю - так, чтобы соответствовать нашим требованиям.

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

Кроме того, было бы неплохо описать вашу ситуацию в области обсуждения проекта по Codeplex. Авторы входят в группу миграции TFS в Microsoft и зависят от отзывов людей в той же лодке, что и мы. До сих пор я обменивался с ними парой электронных писем, и они были очень полезны.

Основываясь на наших обсуждениях с очень полезными сотрудниками Microsoft, мы, скорее всего, будем резервировать базы данных и следовать указаниям на записи в блоге Брайана Кригера (Путь 2: Модернизация миграции). Я надеюсь выполнить тестовый запуск при модернизации с использованием старой резервной копии уже на следующей неделе.

Удачи! Я знаю, это пугает. К счастью, мой опыт установки и настройки со свежей установкой TFS 2010 в лаборатории был гораздо более плавным, чем моя первоначальная подверженность с процессом TFS 2008. Надеюсь, вы найдете то же самое правдой.

-121--4196024-

Насколько я понимаю, в Linux используется механизм копирования на запись для страниц памяти, передаваемых дочернему процессу.

-121--3909741-

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

  Day    |  Count
__________________
 Monday        5
 Tuesday       4
 Monday        6
 Tuesday       3
 ...          ...

Тогда вы можете усреднить эти числа. I.e (5 + 6 )/2 для понедельника.
Что-то подобное должно сработать:

SELECT day_of_week, AVG(order_count) average_order FROM 
(
  SELECT DAYNAME(order_date) day_of_week, 
         DAYOFWEEK(order_date) day_num, 
         TO_DAYS(order_date) date,
         count(*) order_count
  FROM data 
  GROUP BY date
) temp
GROUP BY day_of_week 
ORDER BY day_num

ОБНОВЛЕНИЕ: Я изначально ошибался. Сгруппируйте внутренний SELECT по фактической дате, чтобы получить правильные дневные итоговые значения. Например, вы должны получить, сколько заказов произошло в понедельник (2/1/10) и понедельник (2/8/10) по отдельности. Затем усредните эти итоговые значения по дням недели.

9
ответ дан 13 December 2019 в 19:27
поделиться

Это подойдет, при условии, что order_time является полем date или datetime (так всем будет удобнее ;)). Конечно, есть некоторое приближение, потому что самый старый заказ может быть в пятницу, а самый новый в понедельник, так что количество для каждого дня недели не одинаково, но создание отдельной переменной для каждого дня недели будет болью в заднице. В любом случае, я надеюсь, что это будет полезно на данный момент.

SET @total_weeks = (
    SELECT
        TIMESTAMPDIFF(
            WEEK,
            MIN(order_time),
            MAX(order_time)
        )
     FROM data
    );

SELECT
    DAYNAME(order_time) AS day_of_week,
    ( COUNT(*) / @total_weeks ) AS avgorders,
    COUNT(*) AS total_orders
FROM 
    data
GROUP BY
    DAYOFWEEK(order_time)
1
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: